DATALINK

来自 PostgreSQL wiki
跳转至导航跳转至搜索

这是一个设计文档,用于描述 PostgreSQL 中可能尚不存在某个功能的规划。参阅官方文档了解您版本中提供的功能的信息。

简介

SQL Datalink 是 SQL/MED ISO/IEC 9075-9:2003 规范的一部分。请注意,它与此处描述的努力无关,但互为补充。

Datalink 是一种特殊的 SQL 类型,用于在数据库列中存储 URL,以及可在 SQL 查询中使用的许多函数。

实现 SQL/MED datalink 的 RDBMS 并不多。IBM DB2 实现了该特性。它的大部分内容由 SQL 标准定义为“特定于实现”。

DATALINK 类型的返回值是不透明的,使用 DLVALUE 函数构建。有多个函数可用于将 DATALINK 转换回文本,例如 DLURLCOMPLETE。

没有多少软件需要 SQL/MED datalink。但是,涉及文件、URL 和 Web 的功能在现代应用程序中通常必不可少。通常,将它们与 RDBMS 数据一起使用会很麻烦。SQL/MED 标准化了其中的部分内容。

功能

包含 DATALINK 类型值的还可以选择拥有某些特殊语义

  1. 引用完整性 - datalink 指向的文件无法重命名或删除
  2. 访问控制 - 由 SQL 或文件系统调解
  3. 文件更改的时点恢复

仅将对外部文件的引用存储在数据库中,而不存储文件本身的内容。

SQL/MED 定义的 Datalink 应提供

  • 事务语义
  • 检查文件是否存在
  • 保护链接的文件不受重命名或删除的影响
  • 通过数据库进行读取访问控制
  • 通过数据库进行写入访问控制
  • 时点恢复
  • 删除不再引用的文件
  • 访问位于不同服务器上的文件

以下内容未在 SQL/MED 中指定,但在实践中通常需要(并且可能有需要实现 datalink)

  • 适用于大量 URL 的紧凑 URL 存储(称 int 代替 string,有点像枚举,但对于 URL)
  • URL 与文件系统映射、对文件系统分层结构的访问权限控制
  • 本地服务器文件访问(读取、写入)
  • 远程服务器文件访问(获取、放置)
  • 扩展文件系统属性(获取、设置)
  • 文件元数据(列表、获取、设置)

使用案例

常用案例包括

  • 网站内容管理 - 确保链接到的 URL 存在
  • 工作流程管理 - 提供文件锁定和版本控制功能
  • 配置 - 管理配置文件,例如在数据库中进行更改时重新创建文本配置文件。该文件应锁定,并且只能通过数据库写入。
  • Web 服务器日志存储(许多引荐者 URL)
  • RDF 数据库(许多 URL)

数据链接应使您能够

  • 高效地存储 URL(数据链接存储为整数,而不是字符串)
  • 方便地在 URL 和文件系统路径之间进行映射
  • 从 SQL 安全地读取和写入文件(SQL/MED 未指定此类功能)
  • 保留更改的文件的备份
  • 管理不同服务器上的文件
  • 管理数据链接元数据(统一的扩展文件系统属性界面)

规范

简述

create table my_files (
  ...,
  link datalink,
  ....
)

insert into my_files (link) select dlvalue('file:///etc/passwd');
 
select into url dlurlcomplete(link) from my_files;

update my_files set link=dlnewcopy(url,0);

update my_files set link=dlpreviouscopy(url,0);

数据链接支持函数

数据链接类型的值的构造函数

  • DLVALUE(url) → 数据链接(仅限插入)
  • DLNEWCOPY(url,tokenp) → 数据链接(仅限更新)
  • DLPREVIOUSCOPY(url,tokenp) → 数据链接(仅限更新)

从数据链接类型中提取信息的函数

  • DLURLCOMPLETE(数据链接) → url
  • DLURLCOMPLETEONLY(数据链接) → url
  • DLURLCOMPLETEWRITE(数据链接) → url
  • DLURLPATH(数据链接) → 文件路径
  • DLURLPATHONLY(数据链接) → 文件路径
  • DLURLPATHWRITE(数据链接) → 文件路径
  • DLURLSCHEME(数据链接) → URL 架构(“HTTP”或“FILE”)
  • DLURLSERVER(数据链接) → 服务器地址
  • DLREPLACECONTENT(url, url, 说明) → 数据链接(SQL 2008 中的新增内容)

另一个知名 RDBMS 中的其他函数

  • DLVALUE(地址,链接类型[,说明]) → 数据链接
  • DLCOMMENT(数据链接) → 文本
  • DLLINKTYPE(数据链接) → 链接类型(“FILE”或“URL”)

根据 SQL 规范的数据链接属性

SQL 规范将这些称为链接控制选项。它们作为文本非常冗长,但可以存储在 typmod 中。它们按列指定,因此适用于存储的所有 URL。

链接控制

    • 仅存储数据链接
    • 文件未“链接”,无进一步控制
  • 文件
    • 文件“链接”
    • 文件必须存在
    • 可以通过其他选项指定控制级别

完整性

  • 全部 - 不能删除或重命名链接文件
  • 选择性 - 如果未安装数据链接器,只能使用文件管理器操作删除或修改链接文件
  • 无 - 可以使用文件管理器操作删除或修改引用的文件,与 FILE LINK CONTROL 不兼容

读取访问

  • 数据库
    • 读取权限由 SQL 服务器控制,基于对数据链接值的访问权限
    • 涉及读取访问令牌
      • 由 SQL 服务器编码到 URL 中
      • 由外部文件管理器/数据链接器验证
  • FS
    • 读取权限由文件管理器确定

写入权限

  • 为更新需要令牌的管理员
    • 写入权限由 SQL 服务器(和数据链接器)管理
    • 涉及用于修改文件内容的写入访问令牌
  • 无需令牌即可更新的管理员
    • 写入权限由 SQL 服务器(和数据链接器)管理
  • 已阻止
    • 链接文件无法修改
  • FS
    • 写入权限由文件管理器控制

恢复

在取消链接时

  • 删除
    • 取消链接时将删除文件
  • 恢复
    • 同时恢复原始属性(所有权、权限)
    • 不恢复所有权和权限

实现

SQL/MED 的实现需要大量花招,而且可能甚至无法在纯 Unix 中正确完成。然而,很多部分看起来是可实现的。

系统应至少支持 http: 和 file: URL 方案。这两个方案需要完全不同的实现。可能支持可插入的 URL 方案很有用 - 例如考虑 RDF 名称空间。

在存储多个 URL 时,可以将 URL 仅存储在主 URL 表中一次,并使用 int4 或 int8 作为实际 DATALINK 类型,从而极大地减少空间需求。对于所述用例,这极大地减少了许多 URL 所需的存储需求。有可能根据几个标准对主 URL 表进行分区。

数据链接软件分为几个部分

  • 数据链接数据库架构。主 URL 表存储在此处。
  • 外部进程数据链接器。它使用数据链接架构。它代表 postgresql 服务器管理文件。它使用 postgresql 实现事务语义。

问题:在同一服务器上对多个数据库执行什么操作?

部件

  • DL - DATALINK SQL/MED + 支持功能
  • FILEIO - 本地文件访问功能
  • URL - 解析和操作 - 往往需要获取和设置 URL 和文件名的各个部分

需要某种服务器间通信(以支持远程文件)。在远程 postgresql 实例中通过 libpq(例如 dblink)访问数据链接器 api 也许可行。

其他说明

在 ext3 文件系统上,可以使用“chattr +i”命令锁定文件,但只能由 root 用户使用。这可以防止文件被更改,无论 Unix 文件权限如何,甚至对于 root 用户也是如此。

通过将文件所有者/组更改为 postgres 并设置 Unix 的文件权限,可以有效地使文件归 postgresql 服务器所有(然后可以使用正常的 Unix 函数使用它们)。

PL/PerlU 对于有 Perl 用于外部数据链接的情况来说似乎是正确的选择。适当的安全性和可靠性很难得到保障!

SQL 符合性

SQL 标准中的数据链接功能
标识符 描述 状态
M001 数据链接
M002 通过 SQL/CLI 实现数据链接
M003 通过嵌入式 SQL 实现数据链接
M011 通过 Ada 实现数据链接
M012 通过 C 实现数据链接
M013 通过 COBOL 实现数据链接
M014 通过 Fortran 实现数据链接
M015 通过 M 实现数据链接
M016 通过 Pascal 实现数据链接
M017 通过 PL/I 实现数据链接
数据链接的错误代码
代码 含义
22000 数据异常
22017 为数据链接指定的数据无效
2201A 传递给数据链接构造函数的参数为 NULL
2201D 数据链接值超出最大长度
HW000 数据链接异常
HW001 未链接外部文件
HW002 外部文件已链接
HW003 未找到引用的文件
HW004 无效写入令牌
HW005 无效数据链接构造
HW006 更新过程的写入权限无效
HW007 引用的文件无效
HY093 数据链接值无效