创建数据库对象(例如模式,表或视图)时,将为该对象分配所有者(即执行CREATE语句的用户)。默认情况下,数据库管理员(超级用户)及对象所有者是唯一可以对对象执行任何操作的用户。
为了允许其他用户使用对象,或取消用户使用对象的权限,授权用户必须授予其他用户对该对象的权限。vertica通过GRANT/REVOKE语句授予(或撤消)权限。
Vertica在V_CATALOG.GRANTS系统表中记录数据库对象权限的信息。
下表显示出vertica数据库针对不同对象可授予或撤销的权限类型:
权限继承
可以在三个级别上管理特权的继承:
- 数据库
- schema
- 表格和视图
默认情况下,继承的特权在数据库级别启用,而在schema级别禁用。如果两个级别都启用了特权继承,则表和视图在创建时会自动继承这些特权。也可以从特定的表和视图中排除继承。
数据库继承
启用数据库继承:
ALTER DATABASE [database name] SET disableinheritedprivileges = 0;
终止数据库继承:
ALTER DATABASE [database name] SET disableinheritedprivileges = 1;
schema继承
默认情况下,schema级别的权限继承是被禁止的。必须先启用数据库的继承,才能使用schema的继承。除非明确排除,否则schema中所有新表和视图的权限将自动继承schema中的权限。
启用schema的继承对现有的表和视图没有影响,你必须使用alter table和alter view设置其继承schema权限。
下面的语句将创建一个schema,其中所有的新表和视图都将自动继承schema的权限:
CREATE SCHEMA s1 DEFAULT INCLUDE PRIVILEGES;
也可以修改schema以启用继承:
ALTER SCHEMA s1 DEFAULT INCLUDE PRIVILEGES;
在schema上启用继承后,可以使用grant将权限授予用户和角色。
GRANT USAGE, CREATE, SELECT, INSERT ON SCHEMA S1 TO PUBLIC;
也可以显式取消表和视图继承schema的权限:
CREATE TABLE s1.t1 ( x int) EXCLUDE SCHEMA PRIVILEGES;
ALTER TABLE s1.t1 EXCLUDE SCHEMA PRIVILEGES;
一些常用的数据库对象的权限
database权限
只有数据库超级用户才能创建数据库。在新的数据库中,在自动创建的public schema上授予public角色使用权限。
超级用户可以对数据库本身授予的唯一权限是create权限,它允许用户在数据库中创建schema。
grant create on database dbname to user_x;
schema权限
默认情况下,只有超级用户和schema所有者才有权在schema中创建对象。此外,只有schema所有者或超级用户可以删除或更改schema。
必须通过在SCHEMA PUBLIC上运行GRANT USAGE ON SCHEMA PUBLIC 来授予所有新用户对PUBLIC schema的访问权限。(在此更正一下,新建用户默认具有public schema的usage权限,但是没有其他schema的usage权限)
然后向新用户授予CREATE权限和对schema中各个对象的权限。这使新用户可以在PUBLIC schema中创建或定位对象。没有USAGE特权,即使对象所有者也不能使用或更改schema中的对象。
schema的create权限给与schema所有者或者拥有WITH GRANT OPTION条件的用户在schema中创建新对象,修改schema中的对象以及删除schema中对象的权限。
注:schema所有者通常是创建schema的用户。但是,超级用户可以创建schema,并在创建时将schema的所有权分配给其他用户。
权限 | 描述 |
---|---|
create | 允许用户在schema中创建新对象,重命名以及删除现有对象的权限 |
usage | 允许选择,访问,更改或删除schema中的对象,前提是用户具有针对要操作对象的相应权限。例如,用户想select某个schema下的表,该用户必须具有该schema的usage权限及该表的select权限,二者缺一不可 |
schema的search_path:使用show search_path及set search_path语句。
表权限
默认情况下,只有超级用户和表所有者(通常是创建表的用户)才能访问表。删除或更改表的功能也保留给超级用户或表所有者,无法将此权限授予其他用户。
权限 | 描述 |
---|---|
select | 表的select权限 |
insert | 往表中插入数据的权限 |
delete | 删除数据的权限,以及select权限 |
update | 更新数据的权限,以及select权限 |
references | 对表创建外键约束的权限 |
要使用以上权限,用户还必须要有表对应schema的usage权限。
存储位置权限
没有超级用户权限的用户和角色只要满足以下条件即可在存储位置之间来回复制数据:
- 创建一个特殊的存储位置类(CREATE LOCATION),并将USAGE参数设置为’USER’,这表明非超级用户用户可以访问指定的区域。
- 使用GRANT(存储位置)语句向用户或角色授予对指定位置的READ和/或WRITE访问权限。
注意: GRANT/REVOKE(存储位置)语句仅适用于“USER”存储位置
一旦存在此类存储位置并授予适当的权限,授予读取权限的用户和角色就可以将数据从存储位置中的文件复制到表中。那些被授予WRITE权限的用户可以将数据从表导出到已被授予访问权限的存储位置。WRITE权限还允许用户将COPY语句异常和拒绝的数据文件从Vertica保存到指定的存储位置。
只有超级用户才能添加,更改,收回,删除和还原位置,以及设置和管理位置。所有非dbadmin用户或角色都需要对该位置具有READ和/或WRITE权限。
示例:存储位置权限示例
with grant option
文档中给的解释是:Gives grantee the privilege to grant the same privileges to other users or roles(授予被授予者特权,以向其他用户或角色授予相同的特权)。
解释:当向某个用户A授予权限时使用with grant option选项,则该权限可以由用户A授予其他用户。
测试示例:
创建两个用户user1和user2,针对public schema下测试表test,授予user1 select权限。
grant select on table test to user1;
使用user1登录,可以查看到表test中数据。此时在user1用户下执行:
grant select on table test to user2;
会执行失败,提示:
rollback 2061:"SELECT" privilege(s) for relation "test" could not be granted to "user2"
HINT:check grantor's granting options
而当在超级用户下执行:
grant select on table test to user1 with grant option;
然后再在user1用户下执行:
grant select on table test to user2;
能够执行成功。