5

私のアプリケーションは、いくつかのデータをテーブルに挿入します。

insert into this_Table (id, value, value)

次に、主キーを持つ別のテーブルに単純な挿入を行うトリガーを作成しました。

insert into temp_wc_triggertest values ('test', GETDATE())

scope_identity私の問題は、アプリケーションが最初の挿入からを探しようとすることです。ただし、トリガーによって上書きされ、スコープ ID が の主キーに変更されますtemp_wc_triggertest

トリガーの上書きを停止するにはどうすればよいscope_identityですか?

通常は悪い質問として分類される、ここで役立つコードがあまりないことを認識していますが、現時点では完全なアプリケーションコードにアクセスする権限がないため、これがそのまま答えられることを願っています.

これは SQL Server 2008 R2 上にあります

編集:コードを確認しましたが、scope_identity を使用しています

4

5 に答える 5

3

SCOPE_IDENTIY を正しく使用している場合、既知のバグが発生している可能性もあります - http://connect.microsoft.com/SQLServer/feedback/details/328811

MS は 2012 年にこの問題を完全に修正しており、2008 および 2008R2 のパッチを利用できます。

于 2013-04-08T17:03:29.503 に答える
0

これは、この問題で将来誰にでも役立つ可能性があります。

https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql?view=sql-server-2017

SCOPE_IDENTITYSQLトリガー挿入ステートメントではなく、実際にプライマリ挿入を受け取っているテーブルに挿入されたIDを返す必要があるように見えるため、SQL Serverにパッチを適用する必要がある場合があります。

SQL Server 2017 の Microsoft ドキュメントから (リンクが壊れている場合):

備考 SCOPE_IDENTITY、IDENT_CURRENT、および @@IDENTITY は、ID 列に挿入される値を返すため、同様の関数です。

IDENT_CURRENT はスコープとセッションによって制限されません。指定されたテーブルに限定されます。IDENT_CURRENT は、任意のセッションおよび任意のスコープで特定のテーブルに対して生成された値を返します。詳細については、「IDENT_CURRENT (Transact-SQL)」を参照してください。

SCOPE_IDENTITY と @@IDENTITY は、現在のセッションの任意のテーブルで生成された最後の ID 値を返します。ただし、SCOPE_IDENTITY は現在のスコープ内にのみ挿入された値を返します。@@IDENTITY は特定のスコープに限定されません。

たとえば、T1 と T2 の 2 つのテーブルがあり、T1 に INSERT トリガーが定義されているとします。行が T1 に挿入されると、トリガーが起動し、T2 に行が挿入されます。このシナリオは、T1 での挿入とトリガーによる T2 での挿入という 2 つのスコープを示しています。

T1 と T2 の両方に ID 列があると仮定すると、@@IDENTITY と SCOPE_IDENTITY は、T1 の INSERT ステートメントの最後に異なる値を返します。@@IDENTITY は、現在のセッションの任意のスコープで最後に挿入された ID 列の値を返します。これは T2 に挿入される値です。SCOPE_IDENTITY() は、T1 に挿入された IDENTITY 値を返します。これは、同じスコープで発生した最後の挿入です。SCOPE_IDENTITY() 関数は、スコープ内で ID 列への INSERT ステートメントが発生する前に関数が呼び出された場合、NULL 値を返します。

ステートメントやトランザクションが失敗すると、テーブルの現在の ID が変更され、ID 列の値にギャップが生じる可能性があります。表に値を挿入しようとしたトランザクションがコミットされていなくても、ID 値がロールバックされることはありません。たとえば、IGNORE_DUP_KEY 違反が原因で INSERT ステートメントが失敗した場合でも、テーブルの現在の ID 値はインクリメントされます。

ここに別のリンクがあります:

http://www.sqlbadpractices.com/how-not-to-retrieve-identity-value/

このコードの問題は、挿入した ID 値を取得できない可能性があることです。たとえば、別のテーブルで挿入を実行するテーブルにトリガーがある場合、最後に作成された ID 値を取得します。トリガーをまったく作成しない場合でも、SQL Server が独自のレプリケーション トリガーを作成するため、レプリケートされたテーブルで歪んだ結果が得られる可能性があります。

于 2018-10-15T16:00:21.850 に答える
-2

使用するSELECT IDENT_CURRENT(‘tablename’)

「値を作成した接続に関係なく、値を作成したステートメントのスコープに関係なく、テーブルで作成された最後の IDENTITY 値を返します。」

詳細については、このリンクを参照してください。

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

于 2013-04-08T15:39:11.597 に答える