除了可以通过GRANT使用SQL标准的特权系统之外,表还可以具有行安全性策略,它针对每一个用户限制哪些行可以被普通的查询返回或者可以被数据修改命令插入、更新或删除。这种特性也被称为行级安全性。默认情况下,表不具有任何策略,这样用户根据SQL特权系统具有对表的访问特权,对于查询或更新来说其中所有的行都是平等的。
当在一个表上启用行安全性时(使用ALTER TABLE ... ENABLE ROW LEVEL SECURITY),所有对该表选择行或者修改行的普通访问都必须被一条行安全性策略所允许(不过,表的拥有者通常不服从行安全性策略)。如果表上不存在策略,将使用一条默认的否定策略,即所有的行都不可见或者不能 被修改。应用在整个表上的操作不服从行安全性,例如TRUNCATE和REFERENCES。
行安全性策略可以针对特定的命令、角色或者两者。一条策略可以被指定为适用于ALL命令,或者SELECT、 INSERT、UPDATE、或者DELETE。可以为一条给定策略分配多个角色,并且通常的角色成员关系和继承规则也适用。
要指定哪些行根据一条策略是可见的或者是可修改的,需要一个返回布尔结果的表达式。对于每一行,在计算任何来自用户查询的条件或函数之前,先会计算这个表达式(这条规则的唯一例外是leakproof函数,它们被保证不会泄露信息,优化器可能会选择在行安全性检查之前应用这类函数)。使该表达式不返回true的行将不会被处理。可以指定独立的表达式来单独控制哪些行可见以及哪些行被允许修改。策略表达式会作为查询的一部分运行并且带有运行该查询的用户的特权,但是安全性定义者函数可以被用来访问对调用用户不可用的数据。
具有BYPASSRLS属性的超级用户和角色在访问一个表时总是可以绕过行安全性系统。表拥有者通常也能绕过行安全性,不过表拥有者 可以选择用ALTER TABLE ... FORCE ROW LEVEL SECURITY来服从行安全性。




