SnowPro Advanced: Data Engineer 無料問題 2 / 10 ・ 分野1: Data Movement
監査用のタスクが、ストリームを SELECT で読み、その結果を外部の監査システムへ送っている。監査の担当者から「前回送られた変更が、毎回また送られてくる」と言われた。公式ドキュメントに合う直し方はどれか。
- ストリームを INSERT … SELECT で送信用の表へ移して消費し、送るのはその表から読んだ行にする
- SELECT のたびに SYSTEM$STREAM_HAS_DATA を呼び、FALSE が返るまでオフセットを進めさせる
- ストリームを APPEND_ONLY で作り直し、一度読んだ挿入の行は次の SELECT から返らないようにする
- SELECT を BEGIN と COMMIT で囲み、トランザクションのコミットでストリームのオフセットを進める
正解と解説を見る
正解: A
正解の理由
ストリームはテーブルのデータそのものを持たず、元のオブジェクトに対するオフセットだけを持つ。複数の問い合わせは、オフセットを変えずに同じ変更を読める。オフセットが進むのは、ストリームを DML の文で使い、そのトランザクションがコミットされたときで、問い合わせるだけでは明示的なトランザクションの中でも進まない。SELECT だけの監査タスクでは毎回同じ変更が返るので、INSERT … SELECT で表へ移して消費し、その表から送る形にする。
違う選択肢
「SELECT を BEGIN と COMMIT で囲み、トランザクションのコミットでストリームのオフセットを進める」… ストリームを問い合わせるだけでは、明示的なトランザクションの中でもオフセットは進まない。オフセットを進めるには、ストリームを DML で消費する必要がある。
「ストリームを APPEND_ONLY で作り直し、一度読んだ挿入の行は次の SELECT から返らないようにする」… 追記専用のストリームは挿入だけを記録する種類で、読んだかどうかでオフセットが進むわけではない。SELECT だけで読む限り、同じ挿入が毎回返る。
「SELECT のたびに SYSTEM$STREAM_HAS_DATA を呼び、FALSE が返るまでオフセットを進めさせる」… この関数は変更があるかを返し、空のときに呼ぶとストリームが古くなるのを防ぐ。オフセットを進める働きは無い。
関連する設定
変更を使わずにオフセットだけを今の版へ進めたいときは、ストリームを CREATE OR REPLACE で作り直すか、WHERE 0 = 1 のように全行を除く条件を付けた INSERT で一時表に入れる。