GRANT(7) | SQL Commands | GRANT(7) |
GRANT - 定義訪問權限
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tablename [, ...]
TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTION funcname ([type, ...]) [, ...]
TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE langname [, ...]
TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schemaname [, ...]
TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT 命令將某對象(表,視圖,序列,函數過程語言,或者模式) 上的特定權限給予一個用戶或者多個用戶或者一組用戶。 這些權限將增加到那些已經賦予的權限上,如果存在這些權限的話。
鍵字 PUBLIC
表示該權限要賦予所有用戶,
包括那些以後可能創建的用戶。PUBLIC
可以看做是一個隱含定義好的組,它總是包括所有用戶。
任何特定的用戶都將擁有直接賦予他/她的權限,加上他/她所處的任何組,
以及再加上賦予 PUBLIC
的權限的總和。
如果聲明瞭 WITH GRANT
OPTION,那麼權限的受予者也可以賦予別人。
缺省的時候這是不允許的。賦權選項只能給獨立的用戶,而不能給組或者
PUBLIC。
對對象的所有者(通常就是創建者)而言,沒有什麼權限需要賦予,
因爲所有者缺省就持有所有權限。(不過,所有者出於安全考慮可以選擇廢棄一些他自己的權限。)
刪除一個對象的權力,或者是任意修改它的權力都不是可賦予的權利所能描述的;
它是創建者固有的,並且不能賦予或撤銷。
根據對象的不同,初始的缺省權限可能包括給
PUBLIC
賦予一些權限。缺省設置對於表和模式是沒有公開訪問權限的;
TEMP
表爲數據庫創建權限;EXECUTE
權限用於函數; 以及
USAGE
用於語言。對象所有者當然可以撤回這些權限。
(出於最大安全性考慮,在創建該對象的同一個事務中發出
REVOKE;
那麼就不會打開給別的用戶使用該對象的窗口。)
可能的權限有:
對於模式,允許在該模式中創建新的對象。
要重命名一個現有對象,你必需擁有該對象並且。
對包含該對象的模式擁有這個權限。
對於模式,允許訪問包含在指定模式中的對象(假設該對象的所有權要求同樣也設置了)。
最終這些就允許了權限接受者"查詢"模式中的對象。
其它命令要求的權限都在相應的命令的參考頁上列出。
REVOKE [revoke(7)] 命令用於刪除訪問權限。
我們要注意數據庫超級用戶可以訪問所有對象,
而不會受對象的權限設置影響。這個特點類似
Unix 系統的 root 的權限。和
root
一樣,除了必要的情況,總是以超級用戶身分進行操作是不明智的做法。
If a superuser chooses to issue a GRANT or REVOKE command, the command is performed as though it were issued by the owner of the affected object. In particular, privileges granted via such a command will appear to have been granted by the object owner.
目前,要在 PostgreSQL
裏只對某幾列賦予權限,
你必須創建一個擁有那幾行的視圖然後給那個視圖賦予權限。
使用 psql(1) 的 \z
命令獲取在現有對象上的與權限有關的信息。
=> \z mytable\z 顯示的條目解釋如下:
Access privileges for database "lusitania"
Schema | Table | Access privileges --------+---------+---------------------------------------
public | mytable | {=r/postgres,miriam=arwdRxt/postgres,"group todos=arw/postgres"} (1 row)
=xxxx -- 賦予 PUBLIC 的權限
uname=xxxx -- 賦予一個用戶的權限
group gname=xxxx -- 賦予一個組的權限
r -- SELECT ("讀")
w -- UPDATE ("寫")
a -- INSERT ("追加")
d -- DELETE
R -- RULE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
T -- TEMPORARY
arwdRxt -- ALL PRIVILEGES (for tables)
* -- 給前面權限的授權選項
/yyyy -- 授出這個權限的用戶
GRANT SELECT ON mytable TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON mytable TO GROUP todos;
如果一個給定的對象的
"Access privileges"
字段是空的,
這意味着該對象有缺省權限(也就是說,它的權限字段是
NULL)。
缺省權限總是包括所有者的所有權限,以及根據對象的不同,可能包含一些給
PUBLIC 的權限。
對象上第一個 GRANT 或者
REVOKE
將實例化這個缺省權限(比如,產生
{=,miriam=arwdRxt})
然後根據每次特定的需求修改它。
把表 films 的插入權限賦予所有用戶:
GRANT INSERT ON films TO PUBLIC;
賦予用戶manuel對視圖kinds的所有權限:
GRANT ALL PRIVILEGES ON kinds TO manuel;
根據 SQL 標準,在 ALL PRIVILEGES 裏的 PRIVILEGES 關鍵字是必須的。SQL 不支持在一條命令裏對多個表設置權限。
SQL 標準允許在一個表裏爲獨立的字段設置權限:
GRANT privileges
ON table [ ( column [, ...] ) ] [, ...]
TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ]
SQL 標準對其它類型的對象提供了一個 USAGE 權限:字符集,校勘,轉換,域。
RULE 權限,以及在數據庫,模式,語言和序列上的權限是 PostgreSQL 擴展。
REVOKE [revoke(7)]
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | SQL - Language Statements |