postgresql grant权限解释
----源文http://www.php100.com/manual/PostgreSQL8/sql-grant.htmlGRANTNameGRANT--定义访问权限 SynopsisGRANT{{SELECT|INSERT|UPDATE|DELETE|RULE|REFERENCES|TRIGGER} [,...]|ALL[PRIVILEGES]} ON[TABLE]tablename[,...] TO{username|GROUPgroupname|PUBLIC}[,...][WITHGRANTOPTION] GRANT{{CREATE|TEMPORARY|TEMP}[,...]|ALL[PRIVILEGES]} ONDATABASEdbname[,...][WITHGRANTOPTION] GRANT{EXECUTE|ALL[PRIVILEGES]} ONFUNCTIONfuncname([[argmode][argname]argtype[,...]])[,...][WITHGRANTOPTION] GRANT{USAGE|ALL[PRIVILEGES]} ONLANGUAGElangname[,...][WITHGRANTOPTION] GRANT{{CREATE|USAGE}[,...]|ALL[PRIVILEGES]} ONSCHEMAschemaname[,...][WITHGRANTOPTION] GRANT{CREATE|ALL[PRIVILEGES]} ONTABLESPACEtablespacename[,...][WITHGRANTOPTION] 描述GRANT 命令将某对象(表,视图,序列,函数,过程语言,模式或者表空间) 上的特定权限给予一个用户或者多个用户或者一组用户。 这些权限将增加到那些已经赋予的权限上,如果存在这些权限的话。 键字 PUBLIC 表示该权限要赋予所有用户,包括那些以后可能创建的用户。PUBLIC 可以看做是一个隐含定义好的组,它总是包括所有用户。 任何特定的用户都将拥有直接赋予他/她的权限,加上他/她所处的任何组, 以及再加上赋予 PUBLIC 的权限的总和。 如果声明了 WITH GRANT OPTION,那么权限的受予者也可以赋予别人。 没有这个选项,接受权限的用户不能给别人授权不允许的。 目前,赋权选项只能给独立的用户,而不能给组或者 PUBLIC。 对对象的所有者(通常就是创建者)而言,没有什么权限需要赋予, 因为所有者缺省就持有所有权限。(不过,所有者出于安全考虑可以选择废弃一些他自己的权限。) 删除一个对象的权力,或者是任意修改它的权力都不是可赋予的权利所能描述的; 它是创建者固有的,并且不能赋予或撤销。所有者也隐含地拥有该对象的所有授权选项。 根据对象的不同,初始的缺省权限可能包括给 PUBLIC 赋予一些权限。缺省设置对于表,模式和表空间是没有公开访问权限的; TEMP 表为数据库创建权限;EXECUTE 权限用于函数; 以及 USAGE 用于语言。对象所有者当然可以撤回这些权限。 (出于最大安全性考虑,在创建该对象的同一个事务中发出 REVOKE; 那么就不会打开给别的用户使用该对象的窗口。) 可能的权限有:
其它命令要求的权限都在相应的命令的参考页上列出。 注意REVOKE 命令用于删除访问权限。 如果非对象所有者企图在对象上 GRANT 权限,而该用户没有该对象上指定的权限,那么命令将立即失败。 只要有某些可用的权限,该命令就会继续,但是它只授予那些该用户有授权选项的权限。 如果手头没有可用的授权选项,那么 GRANT ALL PRIVILEGES 形式将发出一个警告信息, 其它命令形式将发出在命令中提到的,但是没有授权选项的那些权限相关的警告信息。 (这些语句原则上也适用于对象所有者,但是因为所有者总是被认为拥有所有授权选项,所以这种情况永远不会发生在所有者身上。) 我们要注意数据库超级用户可以访问所有对象, 而不会受对象的权限设置影响。这个特点类似 Unix 系统的 root 的权限。和 root 一样,除了必要的情况,总是以超级用户身分进行操作是不明智的做法。 目前,PostgreSQL 不支持给一个表的独立字段进行权限赋予和撤销的操作, 一个绕开的办法是创建一个拥有那几行的视图然后给那个视图赋予权限。 使用 psql 的 z 命令获取在现有对象上的与权限有关的信息。 lusitania=>zmytable Accessprivilegesfordatabase"lusitania" Schema|Name|Type|Accessprivileges --------+---------+-------+------------------------------------------------------------ public|mytable|table|{miriam=arwdRxt/miriam,=r/miriam,"grouptodos=arw/miriam"} (1row) z 显示的条目解释如下: =xxxx--赋予PUBLIC的权限 uname=xxxx--赋予一个用户的权限 groupgname=xxxx--赋予一个组的权限 r--SELECT("读") w--UPDATE("写") a--INSERT("追加") d--DELETE R--RULE x--REFERENCES t--TRIGGER X--EXECUTE U--USAGE C--CREATE T--TEMPORARY arwdRxt--ALLPRIVILEGES(用于表) *--给前面权限的授权选项 /yyyy--授出这个权限的用户 用户 miriam 在建完表之后再做下面的语句, 就可以得到上面例子的结果 GRANTSELECTONmytableTOPUBLIC; GRANTSELECT,UPDATE,INSERTONmytableTOGROUPtodos; 如果一个给定的对象的 "Access privileges" 字段是空的, 这意味着该对象有缺省权限(也就是说,它的权限字段是 NULL)。 缺省权限总是包括所有者的所有权限,以及根据对象的不同,可能包含一些给 PUBLIC 的权限。 对象上第一个 GRANT 或者 REVOKE 将实例化这个缺省权限(比如,产生 {=,miriam=arwdRxt}) 然后根据每次特定的需求修改它。 请注意所有者的隐含授权选项没有在显示出来的访问权限里标记出来。 只有在授权选项明确地授予某人之后,才会显示一个 *。 例子把表 films 的插入权限赋予所有用户: GRANTINSERTONfilmsTOPUBLIC; 赋予用户manuel对视图kinds的所有权限: GRANTALLPRIVILEGESONkindsTOmanuel; 请注意,如果上面的命令由超级用户或者 kinds 的所有者执行,那么它实际上会赋予所有权限, 如果由其他人执行,那么它会赋予这个“其他人”拥有授权选项的所有权限。 兼容性根据 SQL 标准,在 ALL PRIVILEGES 里的 PRIVILEGES 关键字是必须的。SQL 不支持在一条命令里对多个表设置权限。 PostgreSQL 允许一个对象所有者撤销它自己的普通权限: 比如,一个表所有者可以让自己对这个表是只读的,方法是撤销自己的 INSERT,UPDATE, 以及 DELETE 权限。根据 SQL 标准,这是不可能的。原因是 PostgreSQL 把所有者的权限当作由所有者给自己赋予的;因此也可以撤销他们。 在 SQL 标准里,所有者的权限是假设为 "_SYSTEM" 实体赋予的。因为所有者不是 "_SYSTEM", 所以他不能撤销这些权限。 SQL 标准允许在一个表里为独立的字段设置权限: GRANTprivilege ONtable[(column[,...])][,...] TO{PUBLIC|username[,...]}[WITHGRANTOPTION] SQL 标准对其它类型的对象提供了一个 USAGE 权限:字符集,校勘,转换,域。 RULE 权限,以及在数据库,表空间,模式,语言和序列上的权限是 PostgreSQL 扩展。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |