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