はじめに
Redshiftのデータ共有、皆さん使われているでしょうか。
物理的なコピーをせず、Redshift間でデータの共有ができて便利ですよね。
さて、このデータ共有ですが、既に共有されているテーブルに対してデータの追加や更新(INSERTやUPDATE)をすると即時反映されますが、テーブルの作成(CREATE TABLE)はデフォルトでは即時反映されません。
テーブルの作成も即時反映させたい場合は、ALTER文で SET INCLUDENEW = TRUE SCHEMA schema
を実施する必要があります。デフォルトではこれがFALSEになっており、かつGUI上ではこれをTRUEに設定できるところが見つかりませんでした。
今回はこれをクエリエディタv2で実施してみます。
前提条件
以下のRedshiftを、それぞれ別のアカウントで作成済み。
- プロデューサーはRedshift Provisioned (RA3)
- データベース名
dev
- データ共有名
demosharing
- データベース名
- コンシューマーはRedshift Serverless
- 上記のデータ共有から作成したデータベース名
sharing_dev
- 上記のデータ共有から作成したデータベース名
やってみる
プロデューサー側
テーブルの確認
クエリエディタv2で、dev
データベースに存在するテーブルを確認します。
現在は、demo_tbl
とtable_3
の2つが存在しています。
ALTER文実行
dev
データベース上で以下のALTER文を実行します。
ALTER DATASHARE demosharing SET INCLUDENEW = TRUE FOR SCHEMA public;
テーブルの新規作成
同じくdev
データベース上でCREATE文を実行してテーブルを作成します。
再度テーブルの確認
プロデューサー側はもちろんテーブルが新規作成されていて、テーブルが3つになっています。
コンシューマー側
テーブルの確認
コンシューマー側では、既にデータ共有からデータベースは作成しています。
そのデータベースsharing_dev
を見てみると、以下のように3つのテーブルが出来ています。プロデューサー側でCREATE TABLE
しただけで、コンシューマー側にも即時反映されていることが分かります。
注意点
プロデューサー側で実行したALTER文ですが、以下のように最後のFOR SCHEMA public
を抜いて実行するとエラーになります。スキーマを指定しないとうまくいかないようです。
おわりに
今回は、データ共有のデータ元のデータベースにテーブルを新規作成した際に即時反映されるように設定してみました。データ共有を作成したタイミングでこのオプションが設定できれば良いのですが、CREATE DATASHARE
を見てもそのようなオプションはありませんでした。
そのため、今回のように一度データ共有を作成してから、ALTER文で設定するしかなさそうです。
即時反映されるようになると便利になる反面、それを知らずに新規テーブルを作成してしまい、共有したくないものが勝手に共有されてしまったという事故につながる可能性もあります。この設定を行う際は注意してください。