DATALINK
这是一个设计文档,用于描述 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 类型值的列还可以选择拥有某些特殊语义
- 引用完整性 - datalink 指向的文件无法重命名或删除
- 访问控制 - 由 SQL 或文件系统调解
- 文件更改的时点恢复
仅将对外部文件的引用存储在数据库中,而不存储文件本身的内容。
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 符合性
标识符 | 描述 | 状态 |
---|---|---|
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 | 数据链接值无效 |