2013-05-16 36 views
5

我需要一個新用戶,但應該授予其他現有用戶/角色具有的所有特權。如何在postgres中創建用戶的重複角色

例如

  • 用戶A在表1的SELECT權限
  • 用戶A在表2
  • 執行權限...

如果創建一個新用戶B,我需要相同的特權,

  • 用戶B對錶1 SELECT權限
  • 用戶B具有EXECUTE對錶2的權限
  • ...

不要問爲什麼:/

其實用戶A在不同的表,模式和功能定製特權;所以手動授予新用戶權限的過程非常冗長冗長。任何幫助都會很好。

回答

0

我不得不編寫pgpsql代碼來循環訪問用戶A的權限並將其授予用戶B.完成時沒有任何問題。

create or replace function update_user_privileges() returns text as 
$$ 
declare 

     info record; 
     str text; 

begin 
     /*Grant privileges to user B the same as with user A for a given table schema*/ 
     str:=''; 
     FOR info IN 
      select * from information_schema.table_privileges where table_schema='public' and grantee = 'A' 
     LOOP 
      /*append the tables' name, for which we are assigning privileges from user A to B*/ 
      str:= str ||info.table_name || ','; 

     /*this is the main statement to grant any privilege*/ 
     execute 'GRANT '|| info.privilege_type ||' on table public.'|| info.table_name || ' to B'; 

     END LOOP; 

    return str; 
end 

$$ language 'plpgsql'; 

用法:複製/粘貼此代碼箱子此功能,然後做

select update_user_privileges(); 

**你必須去適應它爲你的表型模式和表名。希望它可以幫助任何人

+0

什麼是列,函數,視圖權限? – ArunaFromLK

1

首先明白rolesusers是一樣的東西。實際上並沒有一種叫做user的東西,它只是一個ROLELOGIN選項。

第二個roles可以授予其他roles

角色的第三個特權可以繼承。

因此,假設您已經創建了用戶a,如:

CREATE ROLE A LOGIN; 
GRANT SELECT ON table1 TO a; 
GRANT EXECUTE ON FUNCTION xxx TO a; 

您應該能夠建立鏡像像第角色的第二個角色:

CREATE ROLE b LOGIN; 
GRANT a TO b; 
+0

你並不需要指定'爲角色A. INHERIT'僅限於角色B(誰將會繼承權)。 + INHERIT是默認值,所以不需要明確寫入。 –

+0

好一點,我當時是明確的,但它可能只是討厭... *更新* –

+0

如果我不想繼承角色權限,而是授予所有的權限從A到B,也能夠改變A的特權不會影響B – Saad

4

試着這麼做:

GRANT A TO B; 

它將授予角色A的所有權利B.

有關詳細信息,請參閱手冊的this一章。

+0

不足。如果A是超級用戶,則還需要:使用SUPERUSER更改用戶B; –

+0

注意:這將使角色B「繼承」角色A的所有特權。角色將以某種繼承關係進行耦合。這實際上不會重複權限。 –

0

我用下面的方法來創建一個新的用戶使用Ubuntu的現有用戶。

  1. 獲取現有的數據庫完全轉儲。
  2. 使用以下命令提取您想要克隆的用戶的每一行。

    貓/路徑/到/ db_dump_file | grep的「existing_user_name」 >> /path/to/extract.sql

  3. 用文本編輯器打開extract.sql,並與新的用戶名替換現有的用戶名。

  4. 刪除不需要的查詢(如果有的話)。
  5. 現在您有新的SQL查詢來創建新用戶。

這爲我工作就好了。希望這會幫助某人。

相關問題