GRANT(7) | SQL Commands | GRANT(7) |
NAME
GRANT - 定義訪問許可權
SYNOPSIS
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 ]
DESCRIPTION 描述
GRANT 命令將某物件(表,檢視,序列,函式過程語言,或者模式) 上的特定許可權給予一個使用者或者多個使用者或者一組使用者。 這些許可權將增加到那些已經賦予的許可權上,如果存在這些許可權的話。
鍵字 PUBLIC
表示該許可權要賦予所有使用者,
包括那些以後可能建立的使用者。PUBLIC
可以看做是一個隱含定義好的組,它總是包括所有使用者。
任何特定的使用者都將擁有直接賦予他/她的許可權,加上他/她所處的任何組,
以及再加上賦予 PUBLIC
的許可權的總和。
如果聲明瞭 WITH GRANT
OPTION,那麼許可權的受予者也可以賦予別人。
預設的時候這是不允許的。賦權選項只能給獨立的使用者,而不能給組或者
PUBLIC。
對物件的所有者(通常就是建立者)而言,沒有什麼許可權需要賦予,
因為所有者預設就持有所有許可權。(不過,所有者出於安全考慮可以選擇廢棄一些他自己的許可權。)
刪除一個物件的權力,或者是任意修改它的權力都不是可賦予的權利所能描述的;
它是建立者固有的,並且不能賦予或撤銷。
根據物件的不同,初始的預設許可權可能包括給
PUBLIC
賦予一些許可權。預設設定對於表和模式是沒有公開訪問許可權的;
TEMP
表為資料庫建立許可權;EXECUTE
許可權用於函式;
以及 USAGE
用於語言。物件所有者當然可以撤回這些許可權。
(出於最大安全性考慮,在建立該物件的同一個事務中發出
REVOKE;
那麼就不會開啟給別的使用者使用該物件的視窗。)
可能的許可權有:
- SELECT
-
允許對宣告的表,試圖,或者序列 SELECT [select(7)] 任意欄位。還允許做 COPY [copy(7)] TO 的源。 對於序列而言,這個許可權還允許使用 currval 函式。 - INSERT
-
允許向宣告的表 INSERT [insert(7)] 一個新行。 同時還允許做 COPY [copy(7)] FROM。 - UPDATE
-
允許對宣告的表中任意欄位做 UPDATE [update(7)] 。 SELECT ... FOR UPDATE 也要求這個許可權 (除了 SELECT 許可權之外)。比如, 這個許可權允許使用nextval 和 setval。 - DELETE
-
允許從宣告的表中 DELETE [delete(7)] 行。 - RULE
-
允許在該表/檢視上建立規則。(參閱 CREATE RULE [create_rule(7)] 語句。) - REFERENCES
-
要建立一個外來鍵約束,你必須在參考表和被參考表上都擁有這個許可權。 - TRIGGER
-
允許在宣告表上建立觸發器。(參閱 CREATE TRIGGER [create_trigger(7)] 語句。) - CREATE
-
對於資料庫,允許在該資料庫裡建立新的模式。
對於模式,允許在該模式中建立新的物件。 要重新命名一個現有物件,你必需擁有該物件並且。 對包含該物件的模式擁有這個許可權。 - TEMPORARY
- TEMP
-
允許在使用該資料庫的時候建立臨時表。 - EXECUTE
-
允許使用指定的函式並且可以使用任何利用這些函式實現的運算子。 這是適用於函式的唯一的一種許可權型別。 (該語法同樣適用於聚集函式。) - USAGE
-
對於過程語言, 允許使用指定過程語言建立該語言的函式。 這是適用於過程語言的唯一的一種許可權型別。
對於模式,允許訪問包含在指定模式中的物件(假設該物件的所有權要求同樣也設定了)。 最終這些就允許了許可權接受者"查詢"模式中的物件。 - ALL PRIVILEGES
-
一次性給予所有適用於該物件的許可權。 PRIVILEGES 關鍵字在 PostgreSQL 裡是可選的, 但是嚴格的 SQL 要求有這個關鍵字。
其它命令要求的許可權都在相應的命令的參考頁上列出。
NOTES 注意
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 Access privileges for database "lusitania" Schema | Table | Access privileges --------+---------+--------------------------------------- public | mytable | {=r/postgres,miriam=arwdRxt/postgres,"group todos=arw/postgres"} (1 row)\z 顯示的條目解釋如下:
=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 -- 授出這個許可權的使用者使用者 miriam 在建完表之後再做下面的語句, 就可以得到上面例子的結果
GRANT SELECT ON mytable TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON mytable TO GROUP todos;
如果一個給定的物件的
"Access privileges"
欄位是空的,
這意味著該物件有預設許可權(也就是說,它的許可權欄位是
NULL)。
預設許可權總是包括所有者的所有許可權,以及根據物件的不同,可能包含一些給
PUBLIC 的許可權。
物件上第一個 GRANT 或者
REVOKE
將例項化這個預設許可權(比如,產生
{=,miriam=arwdRxt})
然後根據每次特定的需求修改它。
EXAMPLES 例子
把表 films 的插入許可權賦予所有使用者:
GRANT INSERT ON films TO PUBLIC;
賦予使用者manuel對檢視kinds的所有許可權:
GRANT ALL PRIVILEGES ON kinds TO manuel;
COMPATIBILITY 相容性
根據 SQL 標準,在 ALL PRIVILEGES 裡的 PRIVILEGES 關鍵字是必須的。SQL 不支援在一條命令裡對多個表設定許可權。
SQL 標準允許在一個表裡為獨立的欄位設定許可權:
GRANT privileges ON table [ ( column [, ...] ) ] [, ...] TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ]
SQL 標準對其它型別的物件提供了一個 USAGE 許可權:字符集,校勘,轉換,域。
RULE 許可權,以及在資料庫,模式,語言和序列上的許可權是 PostgreSQL 擴充套件。
SEE ALSO 參見
REVOKE [revoke(7)]
譯者
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>
跋
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | SQL - Language Statements |