問題タブ [schemabinding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - SQL Server : ベース テーブルへの挿入を正しく検証しないインデックス付きビュー
SQL Server のインデックス付きビューは、ベース テーブルへの挿入を正しく検証していないと思います。
シミュレートするには、次のことを考慮してください。
テーブルを作成:
テーブルに入力
すべてが順調かどうかを確認する
スキーマバインド ビューを作成する
すべてが順調かどうかを確認する
テーブルを片付ける
クラスター化インデックスを作成してビューを具体化します。
ここで、以前と同じデータを追加してみてください
結果:INSERT
機能しません。クラスター化インデックスの作成が次のINSERT
エラーでブロックされています:
メッセージ 8115、レベル 16、状態 6、行 105
nvarchar をデータ型数値に変換中に算術オーバーフロー エラーが発生しました。ステートメントは終了されました。
ここで何が起きてるの?
インデックス付きビュー ege[module_id] = 'Balances' AND e.[event_id] = 'Transfer' に適用された where 句が適用されていないようです。
結果として、ベース テーブルに挿入されたすべてのデータはビュー [iv_test] に対してチェックされますが、私の意見では、ビュー [iv_test] で指定された WHERE 条件を満たす挿入されたデータのみが、ビュー [iv_test] の形式に対してチェックされます [ iv_test]。
面白いことに、次のアプローチは機能します。
- 最初に ID 1 & 2 のレコードを挿入します。
- 次に、クラスター化インデックスを作成します。
- 次に、ID 3 のレコードを挿入します。
もちろん、これで問題は解決しませんが、クラスター化インデックスを作成した後、インデックス付きビューに対してアクティブな WITH NOCHECK 制約があることが明らかになります。
どんな考えでも大歓迎です