Postgresql 阻止除触发器外的列更新
是否可以配置Postgres数据库,使特定列只能由触发器更新,同时仍允许触发器本身执行,以响应角色的更新,而不允许更新该列?如果是,怎么做 例如,给定的表和触发器如下所示:Postgresql 阻止除触发器外的列更新,postgresql,triggers,permissions,Postgresql,Triggers,Permissions,是否可以配置Postgres数据库,使特定列只能由触发器更新,同时仍允许触发器本身执行,以响应角色的更新,而不允许更新该列?如果是,怎么做 例如,给定的表和触发器如下所示: CREATE TABLE a( id serial PRIMARY KEY, flag boolean NOT NULL DEFAULT TRUE, data text NOT NULL ); CREATE TABLE b( id serial PRIMARY KEY, updated_on DATE
CREATE TABLE a(
id serial PRIMARY KEY,
flag boolean NOT NULL DEFAULT TRUE,
data text NOT NULL
);
CREATE TABLE b(
id serial PRIMARY KEY,
updated_on DATE NOT NULL DEFAULT CURRENT_DATE,
a_id INTEGER NOT NULL,
FOREIGN KEY (a_id) references a(id)
);
CREATE FUNCTION update_aflag() RETURNS trigger AS $update_aflag$
BEGIN
UPDATE a
SET flag = FALSE
WHERE id = NEW.a_id;
RETURN NEW;
END;
$update_aflag$ LANGUAGE plpgsql;
CREATE TRIGGER update_aflag_trigger
AFTER INSERT ON b
FOR EACH ROW
EXECUTE PROCEDURE update_aflag()
;
我想定义一个角色,该角色无权使用
update
语句直接更新a.flag
,但可以通过触发器间接更新flag
。是的,这可以使用安全定义器
触发器函数。触发器函数作为一个角色运行,该角色有权修改标志
列,但您不能向普通用户授予该权限。您应该将触发器函数创建为您将授予所需权限的角色
这要求应用程序不能以拥有表的用户的身份运行,当然也不能以超级用户的身份运行
您可以向用户授予其他列的列更新权限,只需省去标志
列即可。请注意,所有列上的GRANT
ingUPDATE
,然后REVOKE
ing在flag
上将其取消将不起作用,这不是一回事。Wow,感谢Craig的详细回答。现在要通读文档,并尝试提出一个合适的安全定义程序触发函数:)