GRANT

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 ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespacename [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

描述

GRANT 命令將某對像(資料表,視圖,序列,函數,過程語言,模式或者資料表空間) 上的特定權限給予一個用戶或者多個用戶或者一組用戶。 這些權限將增加到那些已經賦予的權限上,如果存在這些權限的話。

鍵字 PUBLIC 資料表示該權限要賦予所有用戶, 包括那些以後可能建立的用戶。PUBLIC 可以看做是一個隱含定義好的組,它總是包括所有用戶。 任何特定的用戶都將擁有直接賦予他/她的權限,加上他/她所處的任何組, 以及再加上賦予 PUBLIC 的權限的總和。

如果聲明了 WITH GRANT OPTION,那麼權限的受予者也可以賦予別人。 沒有這個選項,接受權限的用戶不能給別人授權不允許的。 目前,賦權選項只能給獨立的用戶,而不能給組或者 PUBLIC

對對象的所有者(通常就是建立者)而言,沒有什麼權限需要賦予, 因為所有者預設就持有所有權限。(不過,所有者出於安全考慮可以選擇廢棄一些他自己的權限。) 刪除一個對象的權力,或者是任意修改它的權力都不是可賦予的權利所能描述的; 它是建立者固有的,並且不能賦予或撤銷。所有者也隱含地擁有該對象的所有授權選項。

根據對象的不同,初始的預設權限可能包括給 PUBLIC 賦予一些權限。預設設置對於資料表,模式和資料表空間是沒有公開訪問權限的; TEMP 資料表為資料庫建立權限;EXECUTE 權限用於函數; 以及 USAGE 用於語言。對像所有者當然可以撤回這些權限。 (出於最大安全性考慮,在建立該對象的同一個交易中發出 REVOKE; 那麼就不會打開給別的用戶使用該對象的窗口。)

可能的權限有:

SELECT

允許對聲明的資料表,試圖,或者序列 SELECT 任意字串。還允許做 COPY TO 的源。 對於序列而言,這個權限還允許使用 currval 函數。

INSERT

允許向聲明的資料表 INSERT 一個新行。 同時還允許做 COPY FROM。

UPDATE

允許對聲明的資料表中任意字串做 UPDATESELECT ... FOR UPDATE 也要求這個權限 (除了 SELECT 權限之外)。比如, 這個權限允許使用nextval, 和 setval

DELETE

允許從聲明的資料表中 DELETE 行。

RULE

允許在該資料表/視圖上建立規則。(參閱 CREATE RULE 語句。)

REFERENCES

要建立一個外鍵約束,您必須在參考資料表和被參考資料表上都擁有這個權限。

TRIGGER

允許在聲明資料表上建立觸發器。(參閱 CREATE TRIGGER 語句。)

CREATE

對於資料庫,允許在該資料庫裡建立新的模式。

對於模式,允許在該模式中建立新的對象。 要重命名一個現有對象,您必需擁有該對像並且。 對包含該對象的模式擁有這個權限。

對於資料表空間,允許資料表在該資料表空間中建立,以及允許建立資料庫和模式的時候把該資料表空間指定為其預設資料表空間。 (請注意,撤銷這個權限不會改變現有資料庫和模式的存放位置。)

TEMPORARY
TEMP

允許在使用該資料庫的時候建立臨時資料表。

EXECUTE

允許使用指定的函數並且可以使用任何利用這些函數實現的操作符。 這是適用於函數的唯一的一種權限類型。 (該語法同樣適用於聚集函數。)

USAGE

對於過程語言, 允許使用指定過程語言建立該語言的函數。 這是適用於過程語言的唯一的一種權限類型。

對於模式,允許訪問包含在指定模式中的對象(假設該對象的所有權要求同樣也設置了)。 最終這些就允許了權限接受者"查詢"模式中的對象。

ALL PRIVILEGES

一次性給予所有可以賦予的權限。 PRIVILEGES 關鍵字在 PostgreSQL 裡是可選的, 但是嚴格的 SQL 要求有這個關鍵字。

其它命令要求的權限都在相應的命令的參考頁上列出。

注意

REVOKE 命令用於刪除訪問權限。

如果非對像所有者企圖在對像上 GRANT 權限,而該用戶沒有該對像上指定的權限,那麼命令將立即失敗。 只要有某些可用的權限,該命令就會繼續,但是它只授予那些該用戶有授權選項的權限。 如果手頭沒有可用的授權選項,那麼 GRANT ALL PRIVILEGES 形式將發出一個警告訊息, 其它命令形式將發出在命令中提到的,但是沒有授權選項的那些權限相關的警告訊息。 (這些語句原則上也適用於對像所有者,但是因為所有者總是被認為擁有所有授權選項,所以這種情況永遠不會發生在所有者身上。)

我們要注意資料庫超級用戶可以訪問所有對象, 而不會受對象的權限設置影響。這個特點類似 Unix 系統的 root 的權限。和 root 一樣,除了必要的情況,總是以超級用戶身份進行操作是不明智的做法。

目前,PostgreSQL 不支援給一個資料表的獨立字串進行權限賦予和撤銷的操作, 一個繞開的辦法是建立一個擁有那幾行的視圖然後給那個視圖賦予權限。

使用 psql\z 命令獲取在現有對象上的與權限有關的訊息。

lusitania=> \z mytable

                        Access privileges for database "lusitania"
 Schema |  Name   | Type  |                     Access privileges
--------+---------+-------+------------------------------------------------------------
 public | mytable | table | {miriam=arwdRxt/miriam,=r/miriam,"group todos=arw/miriam"}
(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 (用於資料表)
                  * -- 給前面權限的授權選項

              /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}) 然後根據每次特定的需求修改它。

請注意所有者的隱含授權選項沒有在顯示出來的訪問權限裡標記出來。 只有在授權選項明確地授予某人之後,才會顯示一個 *

例子

把資料表 films 的插入權限賦予所有用戶:

GRANT INSERT ON films TO PUBLIC;

賦予用戶manuel對視圖kinds的所有權限:

GRANT ALL PRIVILEGES ON kinds TO manuel;

請注意,如果上面的命令由超級用戶或者 kinds 的所有者執行,那麼它實際上會賦予所有權限, 如果由其他人執行,那麼它會賦予這個「其他人」擁有授權選項的所有權限。

相容性

根據 SQL 標準,在 ALL PRIVILEGES 裡的 PRIVILEGES 關鍵字是必須的。SQL 不支援在一條命令裡對多個資料表設置權限。

PostgreSQL 允許一個對像所有者撤銷它自己的普通權限: 比如,一個資料表所有者可以讓自己對這個資料表是只讀的,方法是撤銷自己的 INSERT,UPDATE, 以及 DELETE 權限。根據 SQL 標準,這是不可能的。原因是 PostgreSQL 把所有者的權限當作由所有者給自己賦予的;因此也可以撤銷他們。 在 SQL 標準裡,所有者的權限是假設為 "_SYSTEM" 實體賦予的。因為所有者不是 "_SYSTEM", 所以他不能撤銷這些權限。

SQL 標準允許在一個資料表裡為獨立的字串設置權限:

GRANT privilege
    ON table [ ( column [, ...] ) ] [, ...]
    TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ]

SQL 標準對其它類型的對象提供了一個 USAGE 權限:字元集,校勘,轉換,域。

RULE 權限,以及在資料庫,資料表空間,模式,語言和序列上的權限是 PostgreSQL 擴展。

又見

REVOKE