REFERENCES 特权仅与创建外键约束有关?实际用例?

Jos*_*ine 5 mysql postgresql foreign-key permissions referential-integrity

今天我了解了GRANT REFERENCES. 在多年的 SQL 管理和开发工作中,我从未听说过它,也从未遇到过问题。

引用自MySQL 5.7 参考手册/GRANT 语法

REFERENCES 启用外键创建。级别:全局、数据库、表、列。

引用自PostgreSQL 9.6 / GRANT

REFERENCES 要创建外键约束,必须对引用列和被引用列都具有此权限。可以为表的所有列或仅特定列授予特权。

GRANT REFERENCES唯一的有关创建一个外键约束?在什么业务案例中禁止创建外键约束(但允许创建表)有意义?你能给我举个真实世界的例子吗?

joa*_*olo 9

如果您能够创建外键约束,那么您实际上就获得了检查表的特定列(或列集)中特定值是否存在/不存在的权限。您可能无权访问SELECT此列中的整个值列表,但您已经可以了解一些有关它们的信息。您可以尝试在引用表中插入值。您已经知道所允许的那些存在于引用的表中。

如果您对这些值一无所知,则无法授予您在该列上创建 的权限foreign key constraint

添加@Erwin、WRT 指出的注意事项,以便能够防止引用的表中删除。


Erw*_*ter 6

乔阿诺洛所描述的是一个合理的考虑。SELECT如果允许用户创建 FK 引用,则他可以获得引用表的部分权限。

更重要的是,可以创建对表的 FK 引用的用户还可以有效地防止删除行和更新键列。具有 FK 引用的行将以这种方式受到保护(除非CASCADE已为DELETE和定义UPDATE。Postgres手册:

限制和级联删除是两个最常见的选项。 RESTRICT防止删除引用的行。NO ACTION意味着如果检查约束时仍然存在任何引用行,则会引发错误;如果您未指定任何内容,这是默认行为。