【发布时间】:2015-02-09 16:57:01
【问题描述】:
我想阻止用户(每个人)更新主题的特定列以防止循环依赖。
CREATE TABLE Topic(
id serial NOT NULL PRIMARY KEY,
contenxt text DEFAULT NULL, -- can be freely updated
Dependency1 serial REFERENCES Topic(id) ON DELETE RESTRICT, -- CAN'T be updated
Dependency2 serial REFERENCES Topic(id) ON DELETE RESTRICT, -- CAN'T be updated
);
DENY UPDATE ON Topic(Dependency1) TO *; -- Here
DENY UPDATE ON Topic(Dependency2) TO *;
但是在尝试了几个变种之后,它似乎总是报告一些语法错误。修复它开始变得无聊。欢迎使用替代解决方案,但我认为该解决方案相当简单(假设您知道该 u.u 的确切语法)。
在 cmets 中建议使用触发器,但我不知道如何使用触发器来实现。
【问题讨论】:
-
触发器怎么样?有了它,您也可以阻止超级用户的更新。
-
主题表有其他可以更新的字段(“内容”作为文本),因此触发器应该只记录对“依赖项”字段的更改。如果不可能,请告诉我将“内容”移动到另一个表。只是我从来没有那样使用过触发器,所以我不知道从哪里开始
-
查看答案。在 postgresql 中,您可以在列上使用触发器。您也可以仅在价值确实不同时才提出信息。如果需要..
-
DENY 不被 PostgreSQL 使用,它不能工作。只需阅读有关 REVOKE(和 GRANT)的手册:postgresql.org/docs/current/interactive/sql-revoke.html 使用 TRIGGER 是一个非常奇怪的解决方法,因为它应该使用正确的权限来完成。
-
“但是在尝试了几个变体之后,它似乎总是报告一些语法错误。修复它开始变得很无聊。” 在线提供语法。您似乎没有尝试阅读它。 (PostgreSQL 使用
revoke,而不是deny。)
标签: postgresql privileges