Postgresql

刪除表上的持久權限

  • June 11, 2018

我正在嘗試刪除角色my_schema-writers。我不能,因為它擁有對象:

ERROR:  role "my_schema-writers" cannot be dropped because some objects depend on it
DETAIL:  privileges for table your_schema.your_table
1101 objects in database *******
1 object in database *******
1 object in database *******
1 object in database *******
1 object in database *******

果然,它有特權:

my_database=# \dp your_schema.your_table

                                                 Access privileges
┌─────────────┬───────────────────┬───────┬────────────────────────────────────────────────────────────┬───────────────────┐
│   Schema    │       Name        │ Type  │                  Access privileges                         │ Column privileges │
├─────────────┼───────────────────┼───────┼────────────────────────────────────────────────────────────┼───────────────────┤
│ your_schema │     your_table    │ table │ "your_schema-writers"=arwdDxt/"your_schema-writers"       ↵│                   │
│             │                   │       │ "***-writers"=arwdDxt/"your_schema-writers"               ↵│                   │
│             │                   │       │ "server-superusers"=a*r*w*d*D*x*t*/"your_schema-writers"  ↵│                   │
│             │                   │       │ "server-writers"=arwdDxt/"server-superusers"              ↵│                   │
│             │                   │       │ =r/"server-superusers"                                    ↵│                   │
│             │                   │       │ "my_schema-writers"=rx/"server-superusers"                 │                   │
└─────────────┴───────────────────┴───────┴────────────────────────────────────────────────────────────┴───────────────────┘
(1 row)

也就是說,角色my_schema-writersyour_schema.your_table.

我可以撤銷所有特權:

my_database=# REVOKE ALL ON TABLE your_schema.your_table FROM "my_schema-writers";
Time: 1.884 ms

但特權仍然存在:

my_database=# \dp your_schema.your_table

                                                 Access privileges
┌─────────────┬───────────────────┬───────┬────────────────────────────────────────────────────────────┬───────────────────┐
│   Schema    │       Name        │ Type  │                  Access privileges                         │ Column privileges │
├─────────────┼───────────────────┼───────┼────────────────────────────────────────────────────────────┼───────────────────┤
│ your_schema │     your_table    │ table │ "your_schema-writers"=arwdDxt/"your_schema-writers"       ↵│                   │
│             │                   │       │ "***-writers"=arwdDxt/"your_schema-writers"               ↵│                   │
│             │                   │       │ "server-superusers"=a*r*w*d*D*x*t*/"your_schema-writers"  ↵│                   │
│             │                   │       │ "server-writers"=arwdDxt/"server-superusers"              ↵│                   │
│             │                   │       │ =r/"server-superusers"                                    ↵│                   │
│             │                   │       │ "my_schema-writers"=rx/"server-superusers"                 │                   │
└─────────────┴───────────────────┴───────┴────────────────────────────────────────────────────────────┴───────────────────┘
(1 row)

而且我仍然無法刪除角色:

ERROR:  role "my_schema-writers" cannot be dropped because some objects depend on it
DETAIL:  privileges for table your_schema.your_table
1101 objects in database *******
1 object in database *******
1 object in database *******
1 object in database *******
1 object in database *******

my_schema-writers不是任何其他角色的成員,也沒有成員角色:

rpm_2016_02=# \du "my_schema-writers"
              List of roles
┌───────────────────┬──────────────┬───────────┐
│    Role name      │  Attributes  │ Member of │
├───────────────────┼──────────────┼───────────┤
│ my_schema-writers │ Cannot login │ {}        │
└───────────────────┴──────────────┴───────────┘

**如何刪除這些權限和角色?**我能夠刪除1101 objects和其他 4 個人1 object...是備份數據庫中的同一張表。

我也嘗試DROP OWNED BY "my_schema-writers";過沒有錯誤,但仍然無法刪除角色。

我也試過DROP OWNED BY "my_schema-writers";

DROP OWNED是正確的工具。另外,REASSIGN OWNED首先,如果該角色可能擁有任何東西。但手冊指示:

DROP OWNED通常用於準備刪除一個或多個角色。因為DROP OWNED只影響目前數據庫中的對象,所以通常需要在每個包含要刪除的角色擁有的對象的數據庫中執行此命令。

大膽強調我的。因此**,在每個涉及的數據庫中**重複此操作:

REASSIGN OWNED BY "my_schema-writers" TO postgres;  -- or any target role of your choice
DROP OWNED BY "my_schema-writers";

當然,您需要對源角色和目標角色的特權。以超級使用者身份執行此操作可避免所有“權限被拒絕”錯誤。

然後再試一次:

DROP ROLE "my_schema-writers";

與更多細節密切相關的答案:

為什麼沒有REVOKE ALL按預期工作?

You ran:

my_database=# REVOKE ALL ON TABLE your_schema.your_table FROM "my_schema-writers";

您並沒有太熱心,但是#在 psql 提示符my_database=#中通常會將超級使用者指示為會話使用者。

手冊:

使用者只能撤銷該使用者直接授予的權限。例如,如果使用者 A 已向使用者 B 授予了具有授予選項的權限,而使用者 B 又將其授予使用者 C,則使用者 A 不能直接從 C 撤消該權限。相反,使用者 A 可以撤消授予選項從使用者 B 並使用該CASCADE選項,以便依次從使用者 C 撤銷權限。再舉一個例子,如果 A 和 B 都向 C 授予了相同的權限,A 可以撤銷他們自己的授權,但不能撤銷 B 的授權,所以 C 將仍然有效地享有特權。

$$ … $$ 如果超級使用者選擇發出GRANTorREVOKE命令,則執行該命令就好像它是由受影響對象的所有者發出的一樣。由於所有權限最終都來自對象所有者(可能間接通過授予選項鍊),超級使用者可以撤銷所有權限,但這可能需要CASCADE如上所述使用。

特權可能以這種方式持續存在。如果是這樣,重複CASCADE應該刪除它們。但我不會打擾。REASSIGN OWNED/DROP OWNED是要走的路。

另一個數據庫中的同名表(就像您在評論中提到的那樣)對 Postgres 沒有影響 - 只要您沒有錯誤地登錄到錯誤的數據庫。

順便說一句:

Postgres 9.2 現在太舊了(2017 年達到 EOL)。考慮儘早更新到目前版本。不要指望它參與其中,但我不確定。它太舊了。

這 : - \dp your_schema.your_table

命令將 my_schema-writers 顯示為所有權限,例如選擇、插入、更新

關注以下內容

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA your_schema FROM my_schema-writers;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA your_schema FROM my_schema-writers; --just incase if you have sequence 
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA your_schema FROM my_schema-writers; --just incase if you have functions 
DROP USER my_schema-writers;

如果仍然無法刪除嘗試REASSIGN OWNED BY

引用自:https://dba.stackexchange.com/questions/209045