問題タブ [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.

0 投票する
1 に答える
54 参照

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 制約があることが明らかになります。

どんな考えでも大歓迎です