GBase 8c
其他
文章

GBase 8c 行安全性策略(二)

发表于2023-12-06 14:44:4449次浏览1个评论

启用和禁用行安全性以及向表增加策略是只有表拥有者具有的特权。

策略的创建可以使用CREATE POLICY命令,策略的修改 可以使用ALTER POLICY命令,而策略的删除可以使用 DROP POLICY命令。要为一个给定表启用或者禁用行 安全性,可以使用ALTER TABLE命令。

每一条策略都有名称并且可以为一个表定义多条策略。由于策略是表相关的,一个表的每一条策略都必须有一个唯一的名称。不同的表可以拥有相同名称的策略。

当多条策略适用于一个给定的查询时,会把它们用OR(对宽容性策略,默认的策略类型)或者AND(对限制性策略)组合在一起。这和给定角色拥有它作为成员的所有角色的特权的规则类似。宽容性策略和限制性策略在下文将会进一步讨论。

作为一个简单的例子,这里是如何在account关系上创建一条策略以允许只有managers角色的成员能访问行,并且只能访问它们账户的行:

CREATE TABLE accounts (manager text, company text, contact_email text);

ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;

CREATE POLICY account_managers ON accounts TO managers

    USING (manager = current_user);

上面的策略隐含地提供了一个与其该约束适用于被一个命令选择的行(这样一个经理不能SELECT、UPDATE或者DELETE属于其他经理的已有行)以及被一个命令修改的行(这样属于其他经理的行不能通过INSERT或者UPDATE创建)。

如果没有指定角色或者使用了特殊的用户名PUBLIC, 则该策略适用于系统上所有的用户。要允许所有用户访问users 表中属于他们自己的行,可以使用一条简单的策略:

CREATE POLICY user_policy ON users

    USING (user_name = current_user);

这个例子的效果和前一个类似。

为了对增加到表中的行使用与可见行不同的策略,可以组合多条策略。这一对策略将允许所有用户查看users表中的所有行,但只能修改他们自己的行:

CREATE POLICY user_sel_policy ON users

    FOR SELECT

    USING (true);

CREATE POLICY user_mod_policy ON users

    USING (user_name = current_user);

在一个SELECT命令中,这两条规则被用OR组合在一起,最终的效应就是所有的行都能被选择。在其他命令类型中,只有第二条策略适用,这样其效果就和以前相同。

也可以用ALTER TABLE命令禁用行安全性。禁用行安全性不会移除定义在表上的任何策略,它们只是被简单地忽略。然后该表中的所有 行都是可见的并且可修改,服从于标准的SQL特权系统。

评论

登录后才可以发表评论
崔哥发表于 3个月前
杏花开了燕飞忙,正是好春光。偏是好春光,者几日、风凄雨凉。杨枝飘泊,桃根娇小,独自个思量。刚待不思量,吹一片、箫声过墙。