2017-10-12 7 views
1

ステージングDBとプロダクションDBで実行されるRedshift移行を作成しています。この移行でユーザーへのアクセスを許可し、ユーザーの名前はどのDBが移行されているかによって異なります。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() 

これを行うための好ましい方法であるものレッドシフトで?

編集:ClojureでMigratusのマイグレーションを実行しています(何か助けが必要な場合)。

答えて

0

明らかに、Redshiftはステートメントでサブクエリを処理するメカニズムを持っていません。 RedshiftはPostgreSQL 8.0.2のフォークであるため、PostgreSQLの後のバージョンではDO blocks機能は利用できません。

別のデータベースとユーザーではなく、ステージング環境と本番環境で完全に別々のクラスタを使用する方がよいでしょう。これにより、SQLマイグレーション・ステートメントで「if logic」を使用する必要がなくなり、異なるクラスター環境で同じクラスターを共用するという他の短所を回避できます。

ステージング/テスト環境でのコスト削減のヒントについては、this投稿を参照してください。

0

グループにアクセス許可を割り当てるには、グループ(CREATE GROUP)を使用します。

あなたの唯一の問題は、フロントで行うことができるALTER GROUPです。だから、移行スクリプトは、ハードコーディングすることができます。

GRANT SELECT ON TABLE my_table TO MyGroup; 

更新、PRODにコメント

(ステージング用リバース)

ALTER GROUP MYGROUPがUSERのDB_USERを追加した後、 ALTER GROUP MyGroup DROP USER staging_user;

あなたはClojureのから完全にプログラム可能なクエリを持つようにEDN移行を実行することができますあまりにもmigratus

+0

あなたの早い回答に感謝します。残念ながら、両方のユーザーを同じグループに入れると、残念ながら、移行がプロダクションで実行されると、 "prod_db"への "staging_user"アクセスが許可されます。 – GeorgCantor

+0

@GeorgCantorは、環境に基づいて正しいユーザーメンバーシップのみを許可します。つまり、グループとメンバーシップは、クライアント内で個別に、またはより動的に実行できます。 – gbn

+0

これは同じ問題を引き起こしませんか?現在のDBに基づいてメンバーシップを動的に付与する必要があります。これはできません。 – GeorgCantor

0

GRANT USAGE ON SCHEMA忘れないでください。

そのサブクエリのロジックを実装できるはずです。

関連する問題