2017-10-12 100 views
1

我正在寫一個將在暫存數據庫和生產數據庫上運行的Redshift遷移。我希望這種遷移能夠授予用戶訪問權限,並且用戶的名稱取決於正在遷移的數據庫。GRANT中的Redshift子查詢

例如,如果當前DB是「staging_db」,我希望遷移將權限授予「staging_user」,如果當前DB是「prod_db」,則授予「prod_user」權限。

一個幼稚的做法是這樣的:

GRANT SELECT 
ON TABLE my_table 
TO (SELECT CASE current_database() 
      WHEN 'staging_db' THEN 'staging_user' 
      WHEN 'prod_db' THEN 'db_user' 
      END); 

雖然,這個錯誤告訴我SELECT子查詢未在GRANT語句允許:

ERROR: syntax error at or near "(" 
LINE 3: TO (SELECT CASE current_database() 

什麼是這樣做的首選方式在Redshift中?

編輯:我正在Clojure中運行Migratus的遷移,如果它可以有任何幫助的話。

回答

0

顯然,Redshift沒有處理語句中的子查詢的機制。由於Redshift是PostgreSQL 8.0.2的一個分支,它在後來的Pos​​tgreSQL版本中都沒有DO blocks功能。

更好的方法是爲分段和生產環境設置完全獨立的集羣,而不是單獨的數據庫和用戶。這將消除在SQL遷移語句中具有「如果邏輯」的需要,並且將避免在不同環境中共享相同羣集的其他缺點。

有關如何降低分段/測試環境成本的有用提示,請參閱this後。

0

使用組(CREATE GROUP),以便您可以將權限分配給組。

然後你唯一的問題是需要的ALTER GROUP,可以做前面。因此遷移腳本可以被硬編碼:

GRANT SELECT ON TABLE my_table TO MyGroup; 

更新,評論

PROD上後(反向分期)

ALTER GROUP MyGroup的ADD USER DB_USER; ALTER GROUP MyGroup DROP USER staging_user;

不要忘了GRANT USAGE ON SCHEMA

+0

感謝您的快速回答。將這兩個用戶放在同一組中,不幸的是,一旦遷移將在生產環境中運行,將授予對「prod_db」的「staging_user」訪問權 – GeorgCantor

+0

@GeorgCantor僅授予基於環境的正確用戶成員身份。也就是說,該組和成員可以在客戶端單獨或更動態地完成。 – gbn

+0

這不會導致同樣的問題嗎?我需要根據當前的數據庫動態授予會員資格,這是我無法做到的。 – GeorgCantor

0

隨着migratus可以運行EDN遷移從Clojure的具有完全可編程查詢。

你應該能夠在那裏實現該子查詢的邏輯!