PostgreSQL 防止每个人都更新列
PostgreSQL Prevent updating columns EVERYONE
我想阻止用户(每个人)更新主题的特定列以防止循环依赖。
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 的确切语法)。
在评论中建议使用触发器,但我不知道如何使用触发器来实现。
试试这个:
CREATE OR REPLACE FUNCTION fnprevent_update()
RETURNS trigger AS
$BODY$
BEGIN
RAISE EXCEPTION 'no way';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER trg_prevent_update
BEFORE UPDATE OF dependency1, dependency2
ON topic
FOR EACH ROW
EXECUTE PROCEDURE fnprevent_update();
只需自定义 "no way" 消息。
PostgreSQL 支持列级权限。您可能需要这些方面的东西。
grant select(id, dependency1, dependency2), update(id) on topic to public;
我想阻止用户(每个人)更新主题的特定列以防止循环依赖。
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 的确切语法)。
在评论中建议使用触发器,但我不知道如何使用触发器来实现。
试试这个:
CREATE OR REPLACE FUNCTION fnprevent_update()
RETURNS trigger AS
$BODY$
BEGIN
RAISE EXCEPTION 'no way';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER trg_prevent_update
BEFORE UPDATE OF dependency1, dependency2
ON topic
FOR EACH ROW
EXECUTE PROCEDURE fnprevent_update();
只需自定义 "no way" 消息。
PostgreSQL 支持列级权限。您可能需要这些方面的东西。
grant select(id, dependency1, dependency2), update(id) on topic to public;