Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 阻止除触发器外的列更新_Postgresql_Triggers_Permissions - Fatal编程技术网

Postgresql 阻止除触发器外的列更新

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

是否可以配置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 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
ing
UPDATE
,然后
REVOKE
ing在
flag
上将其取消将不起作用,这不是一回事。

Wow,感谢Craig的详细回答。现在要通读文档,并尝试提出一个合适的
安全定义程序
触发函数:)