设置表和视图的权限继承
当心
使用 ALTER SCHEMA 启用继承权限DEFAULT INCLUDE PRIVILEGES 仅影响新创建的表和视图。
此设置不会影响已存在的表和视图。
如果为数据库和架构启用了继承的权限,则授予架构的权限将自动授予其中的所有新表和视图。您还可以显式排除表和视图继承架构权限。
有关哪些表和视图从哪些架构继承权限的信息,请参阅 INHERITING_OBJECTS。
有关每个表或视图继承哪些权限的信息,请参阅 INHERITED_PRIVILEGES。
设置表和视图的权限继承
CREATE TABLE/ALTER TABLE 和 CREATE VIEW/ALTER VIEW 可以允许表和视图从其父架构继承权限。例如,以下语句在架构 s1 上启用继承,因此新表 s1.t1 和视图 s1.myview 会自动继承在该架构上设置的权限(如果适用):
=> CREATE SCHEMA s1 DEFAULT INCLUDE PRIVILEGES;
CREATE SCHEMA
=> GRANT USAGE, CREATE, SELECT, INSERT ON SCHEMA S1 TO PUBLIC;
GRANT PRIVILEGE
=> CREATE TABLE s1.t1 ( ID int, f_name varchar(16), l_name(24));
WARNING 6978: Table "t1" will include privileges from schema "s1"
CREATE TABLE
=> CREATE VIEW s1.myview AS SELECT ID, l_name FROM s1.t1
WARNING 6978: View "myview" will include privileges from schema "s1"
CREATE VIEW
注意
这两个 CREATE 语句都省略了 INCLUDE SCHEMA PRIVILEGES 子句,因此它们返回一条警告消息,表明新对象将继承架构权限。包含此子句的 CREATE 语句不返回警告消息。如果架构已经存在,您可以使用 ALTER SCHEMA 让所有新创建的表和视图继承架构的权限。但是,在此语句之前在架构上创建的表和视图不受影响:
=> CREATE SCHEMA s2;
CREATE SCHEMA
=> CREATE TABLE s2.t22 ( a int );
CREATE TABLE
...
=> ALTER SCHEMA S2 DEFAULT INCLUDE PRIVILEGES;
ALTER SCHEMA
在此例中,在架构 s2 已经包含表 s2.t22 之后,在该架构上启用继承的权限。要在此表和其他现有表和视图上设置继承,必须使用 ALTER TABLE 和 ALTER VIEW 对它们显式设置架构继承:
=> ALTER TABLE s2.t22 INCLUDE SCHEMA PRIVILEGES;
排除表和视图继承权限
您可以使用 CREATE TABLE/ALTER TABLE 和 CREATE VIEW/ALTER VIEW 禁止表和视图继承架构权限。
以下示例显示了如何创建不继承架构权限的表:
=> CREATE TABLE s1.t1 ( x int) EXCLUDE SCHEMA PRIVILEGES;
您可以修改现有表,使其不继承架构权限:
=> ALTER TABLE s1.t1 EXCLUDE SCHEMA PRIVILEGES;