<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # GRANT ## Name GRANT?--?賦予訪問權限 ## Synopsis ``` GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] _table_name_ [, ...] | ALL TABLES IN SCHEMA _schema_name_ [, ...] } TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( _column_name_ [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( _column_name_ [, ...] ) } ON [ TABLE ] _table_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE _sequence_name_ [, ...] | ALL SEQUENCES IN SCHEMA _schema_name_ [, ...] } TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE _database_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN _domain_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER _fdw_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER _server_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION _function_name_ ( [ [ _argmode_ ] [ _arg_name_ ] _arg_type_ [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA _schema_name_ [, ...] } TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE _lang_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT _loid_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA _schema_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE _tablespace_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPE _type_name_ [, ...] TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT _role_name_ [, ...] TO _role_name_ [, ...] [ WITH ADMIN OPTION ] ``` ## 描述 `GRANT`命令有兩個基本變種:一個變種是給數據庫對象 (表、字段、視圖、外部表、序列、數據庫、外部數據封裝器、外部服務器、函數、過程語言、 模式、表空間)賦予權限;一個變種是賦予一個角色中的成員關系。這些變種在很多方面都非常類似, 但是它們之間的區別也有足夠理由來分開描述。 ### 在數據庫對象上的 GRANT 這個變種的`GRANT`命令在數據庫對象上給一個或多個角色授予特定的權限。 這些權限追加到已經授予的權限上。 也有一個選項賦予一個或多個模式內的相同類型的所有對象權限。這個功能當前只支持表, 序列和函數(但請注意`ALL TABLES`被認為包含視圖和外部表)。 關鍵字`PUBLIC`表示該權限要賦予所有角色,包括那些以后可能創建的用戶。 `PUBLIC`可以看做是一個隱含定義好的組,它總是包括所有角色。 任何特定的角色都將擁有直接賦予他/它的權限,加上他/它所處的任何組, 以及再加上賦予`PUBLIC`的權限的總和。 如果聲明了`WITH GRANT OPTION`,那么權限的接收者也可以將此權限賦予他人, 否則就不能授權他人。這個選項不能賦予`PUBLIC`。 對于對象的所有者(通常就是創建者)而言,沒有什么權限需要賦予,因為所有者缺省就持有所有權限。 不過,所有者出于安全考慮可以選擇廢棄一些他自己的權限。 刪除一個對象的權力,或者是任意修改它的權力都不是可賦予的權限;它是創建者固有的, 并且不能賦予或撤銷。(然而,一個類似的影響可以通過賦予或撤銷擁有這個對象的角色的成員關系來獲得; 參閱下文。)所有者也隱含地擁有該對象的所有授權選項。 PostgreSQL給`PUBLIC`對象的某些類型賦予缺省的權限。在表、字段、 模式或表空間上缺省不會賦予`PUBLIC`權限。對于其他類型, 賦予`PUBLIC`以下缺省的權限:數據庫為 `CONNECT` 和`CREATE TEMP TABLE`權限;函數為`EXECUTE`權限; 語言為`USAGE`權限。對象所有者當然可以`REVOKE` 缺省的或明確賦予的權限。出于最大安全性考慮,在創建該對象的同一個事務中發出 `REVOKE`就不會打開給別的用戶使用該對象的窗口。同樣, 這些缺省初始化權限設置可以使用[ALTER DEFAULT PRIVILEGES](#calibre_link-1034)命令改變。 可能的權限有: SELECT 允許對聲明的表、視圖、序列[SELECT](#calibre_link-104)任意字段或指定字段列表。 還允許做[COPY](#calibre_link-777)的源。這個權限也需要引用[UPDATE](#calibre_link-749) 或[DELETE](#calibre_link-490)現存的字段值。對于序列而言,這個權限還允許使用 `currval`函數。對于大對象,這個權限允許讀對象。 INSERT 允許向聲明的表[INSERT](#calibre_link-1382)一個新行。如果列出了指定的字段, 那么只有列出的字段被指派給`INSERT`命令(其他字段因此接受缺省的值)。 同時還允許做[COPY](#calibre_link-777)。 UPDATE 允許對聲明的表中任意字段或指定的字段列表做[UPDATE](#calibre_link-749)。 實際上,任何重要的`UPDATE`命令也需要`SELECT`權限, 因為必須引用表字段決定要更新哪個行,和/或為字段計算新值。 `SELECT ... FOR UPDATE`和`SELECT ... FOR SHARE` 也至少在一個字段上要求這個權限,除了`SELECT`權限之外。比如, 這個權限允許使用`nextval`和`setval`函數。 對于大對象,這個權限允許寫或截斷對象。 DELETE 允許從聲明的表中[DELETE](#calibre_link-490)行。實際上,任何重要的`DELETE` 命令也需要`SELECT`權限,因為必須引用表字段決定要刪除哪個行。 TRUNCATE 允許在指定的表上[TRUNCATE](#calibre_link-89)。 REFERENCES 要創建一個外鍵約束,你必須在參考字段和被參考字段上都擁有這個權限。 該權限可能賦予了表的所有字段,或只是賦予了指定的字段。 TRIGGER 允許在聲明表上創建觸發器(參見[CREATE TRIGGER](#calibre_link-459)語句)。 CREATE 對于數據庫,允許在該數據庫里創建新的模式。 對于模式,允許在該模式中創建新的對象。要重命名一個現有對象, 你必需擁有該對象_并且_對包含該對象的模式擁有這個權限。 對于表空間,允許在其中創建表,索引和臨時文件,以及允許創建數據庫的時候把該表空間指定為其缺省表空間。 請注意,撤銷這個權限不會改變現有對象的存放位置。 CONNECT 允許用戶連接到指定的數據庫。該權限將在連接啟動時檢查 (除了檢查`pg_hba.conf`中的任何限制之外)。 TEMPORARY TEMP 允許在使用指定數據庫的時候創建臨時表 EXECUTE 允許使用指定的函數并且可以使用任何利用這些函數實現的操作符。 這是適用于函數的唯一權限。該語法同樣適用于聚集函數。 USAGE 對于過程語言,允許使用指定過程語言創建該語言的函數。這是適用于過程語言的唯一權限。 對于模式,允許訪問包含在指定模式中的對象(假設該對象的所有權要求同樣也設置了)。 最終這些就允許了權限接受者"查詢"模式中的對象。沒有這個權限仍然可以看見這些對象的名字 (比如通過查詢系統視圖)。同樣,撤銷該權限之后,現有的后端可能有在查找之前就執行了的語句, 因此這不是一個很安全的限制對象訪問的方法。 對于序列,該權限允許使用`currval`和`nextval`函數。 對于類型和域,該權限允許在創建表、函數和其他模式對象時使用類型或域。 (請注意,它不控制類型的一般"使用",例如顯示在查詢中的該類型的值。 它只防止依賴于該類型的對象被創建。該權限的主要目的是控制哪個用戶在類型上創建依賴, 該依賴會防止用戶稍后改變類型。) 對于外部數據封裝器,該權限使權限接受者能夠使用那個外部數據封裝器創建新的服務器。 對于服務器,該權限使權限接受者能夠使用該服務器創建外部表,并且也能創建、 修改或刪除他自己的用戶的與該服務器相關的用戶映射。 ALL PRIVILEGES 一次性給予所有可以賦予的權限。`PRIVILEGES`關鍵字在 PostgreSQL里是可選的,但是嚴格的 SQL 要求有這個關鍵字。 其它命令要求的權限都在相應的命令的參考頁上列出。 ### 角色上的 GRANT 這個變種的`GRANT`命令把一個角色的成員關系賦予一個或多個其它角色。 角色里的成員關系很重要,因為它會將賦予該角色的權限傳播給所有該角色的成員。 如果聲明了`WITH ADMIN OPTION`,那么該成員隨后就可以將角色的成員關系賦予其它角色, 以及撤銷其它角色的成員關系。如果沒有 admin 選項,普通用戶就不能這么做。不過, 數據庫超級用戶可以給任何人賦與或者撤銷任何角色的任何成員關系。擁有`CREATEROLE` 權限的角色可以賦予或者撤銷任何非超級用戶角色的成員關系。 與權限不同,角色的成員關系不能被賦予`PUBLIC`。需要注意的是, 這種形式的命令不允許使用無意義的`GROUP`關鍵字。 ## 注意 [REVOKE](#calibre_link-20)命令用于刪除訪問權限。 自PostgreSQL 8.1以來,用戶和組的概念統一為角色。 因此不再需要使用關鍵字`GROUP`來確定接受者是一個用戶還是一個組。 仍然允許在命令中出現`GROUP`,但這是一個噪聲字。 一個用戶可以他有相應權限的字段上執行`SELECT`, `INSERT`等,該權限是在指定字段或整個表上。 在表級別授予權限然后從一個字段上撤銷該權限將不會做你希望發生的事情:表級別的授權不受字段級別操作的影響。 如果非對象所有者企圖在對象上`GRANT`權限,而該用戶沒有該對象上指定的權限, 那么命令將立即失敗。只要有某些可用的權限,該命令就會繼續,但是它只授予那些該用戶有授權選項的權限。 如果沒有可用的授權選項,那么`GRANT ALL PRIVILEGES`形式將發出一個警告信息, 其它命令形式將發出在命令中提到的、但是沒有授權選項的那些權限相關的警告信息。 這些語句原則上也適用于對象所有者,但是因為所有者總是被認為擁有所有授權選項, 所以這種情況永遠不會發生在所有者身上。 要注意數據庫超級用戶可以訪問所有對象,而不會受對象的權限設置影響。 這個特點類似 Unix 系統的`root`的權限。和`root`一樣,除了必要的情況, 總是以超級用戶身份進行操作是不明智的做法。 如果一個超級用戶選擇發出一個`GRANT`或`REVOKE`命令, 那么這條命令將是以被影響對象的所有者的形式執行的。特別是, 通過這種方法賦與的權限將顯得好像是由對象所有者賦與的。對于角色成員關系, 成員關系的賦與就會像是通過包含角色自己賦與的一樣。 `GRANT`和`REVOKE`也可以不由被影響對象的所有者來執行, 而是由擁有該對象的角色的一個成員來執行,或者是一個在該對象上持有 `WITH GRANT OPTION`權限的角色的成員。在這種情況下, 該權限將被紀錄為是由實際擁有該對象或者持有`WITH GRANT OPTION` 權限的對象賦與的。比如,如果表`t1`被角色`g1`擁有, 并且`u1`是`g1`的一個成員,然后`u1`可以把`t1` 的權限賦予`u2`,但是這些權限將表現為是由`g1`直接賦予的。 任何`g1`角色的成員都可以在之后撤銷這些權限。 如果執行`GRANT`的角色所持有的所需權限是通過角色成員關系間接獲得的, 那么究竟是那個角色將被紀錄為賦予權限的角色就是未知的。在這種情況下, 最好的方法是使用`SET ROLE`成為你想執行`GRANT`命令的指定角色。 在表上賦予的權限不會自動傳播到該表使用的序列上,包括`SERIAL`字段上的序列。 必須單獨設置序列的權限。 使用[psql](#calibre_link-23)的`\dp` 命令獲取表和字段的現存權限的有關的信息。例如: ``` => \dp mytable Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+---------+-------+-----------------------+-------------------------- public | mytable | table | miriam=arwdDxt/miriam | col1: : =r/miriam : miriam_rw=rw/miriam : admin=arw/miriam (1 row) ``` `\dp`顯示的條目解釋如下: ``` rolename=xxxx -- 賦予一個角色的權限 =xxxx -- 賦予 PUBLIC 的權限 r -- SELECT ("讀") w -- UPDATE ("寫") a -- INSERT ("追加") d -- DELETE D -- TRUNCATE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE c -- CONNECT T -- TEMPORARY arwdDxt -- ALL PRIVILEGES (用于表,用于其他對象時不同) * -- 給前面權限的授權選項 /yyyy -- 授出這個權限的角色 ``` 用戶`miriam`在建完`mytable`表之后再做下面的語句,就可以得到上面例子的結果: ``` GRANT SELECT ON mytable TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON mytable TO admin; GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw; ``` 對于非表的對象,可以使用`\d`命令顯示他們的權限。 如果一個給定的對象的"Access privileges"字段是空的,這意味著該對象有缺省權限 (也就是說,它的權限字段是 NULL)。缺省權限總是包括所有者的所有權限,以及根據對象的不同, 可能包含一些給`PUBLIC`的權限。對象上第一個`GRANT`或`REVOKE` 將實例化這個缺省權限(比如,產生 `{miriam=arwdDxt/miriam}`) 然后根據每次特定的需求修改它。 相似的,"Column access privileges"中的記錄只為非缺省權限字段。(請注意:為了這個目的, "default privileges"總是意味著該對象類型的內建缺省權限。受`ALTER DEFAULT PRIVILEGES` 命令影響權限的對象總是和一個包括`ALTER`影響的明確權限記錄一起顯示。) 請注意所有者的隱含授權選項沒有在顯示出來的訪問權限里標記出來。 只有在授權選項明確地授予某人之后,才會顯示一個`*`。 ## 例子 把表`films`的插入權限賦予所有用戶: ``` GRANT INSERT ON films TO PUBLIC; ``` 賦予用戶`manuel`對視圖`kinds`的所有權限: ``` GRANT ALL PRIVILEGES ON kinds TO manuel; ``` 請注意,如果上面的命令由超級用戶或者`kinds`的所有者執行,那么它實際上會賦予所有權限, 如果由其他人執行,那么它會賦予這個"其他人"擁有授權選項的所有權限。 把角色`admins`的成員關系賦與用戶`joe`: ``` GRANT admins TO joe; ``` ## 兼容性 根據 SQL 標準,在`ALL PRIVILEGES`里的`PRIVILEGES`關鍵字是必須的。 SQL 標準不支持在一條命令里對多個表設置權限。 PostgreSQL允許一個對象所有者撤銷它自己的普通權限:比如, 一個表所有者可以讓自己對這個表是只讀的,方法是撤銷自己的`INSERT`, `UPDATE`, `DELETE`, 和 `TRUNCATE`權限。根據 SQL 標準, 這是不可能的。原因是PostgreSQL把所有者的權限當作由所有者給自己賦予的; 因此也可以撤銷他們。在 SQL 標準里,所有者的權限是假設為"_SYSTEM"實體賦予的。 因為所有者不是"_SYSTEM",所以他不能撤銷這些權限。 根據 SQL 標準,授權選項可以授予`PUBLIC`;PostgreSQL 只支持授予授權選項給角色。 SQL 標準對其它類型的對象提供了一個`USAGE`權限:字符集、校勘、轉換。 在SQL標準中,序列只有一個`USAGE`權限,該權限控制`NEXT VALUE FOR` 表達式的使用,該表達式相當于PostgreSQL中的`nextval`函數。序列權限 `SELECT`和`UPDATE`是PostgreSQL的擴展。序列`USAGE` 權限應用到`currval`函數也是一個PostgreSQL擴展(就像函數本身)。 在數據庫、表空間、模式、語言上的權限是PostgreSQL擴展。 ## 又見 [REVOKE](#calibre_link-20), [ALTER DEFAULT PRIVILEGES](#calibre_link-1034)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看