3

私はすでに数時間これで頭を悩ませてきました... これが起こっていることです:

私はこの声明を実行します

SELECT STATUS FROM [dbo].[TMP_TEST_CALL_LIST] where identity = '659303186000000000'

次の結果が得られます (単一行):

「よ」

次に、このステートメントを実行します

update [dbo].[TMP_TEST_CALL_LIST] set status='Z' where identity = '659303186000000000'

そして私はこれを手に入れます!!!:

(1 行が影響を受けます)

(1 行が影響を受けます)

あたかも 2 つのステートメントが実行されたかのように!

しかし、それはさらに悪化します...次のように実行しても:

update [dbo].[TMP_TEST_CALL_LIST] set status='Z' where identity = '659303186000000000' AND status ='Y'

同じ「二重」の結果が得られます。そして、どのレコードにも一致しない WHERE 句を使用して実行すると、影響を受ける行が 0 行であることがわかります... 2 回。

(さらに) 恐ろしいことは、これが DB 内の一部のテーブルで発生していて、他のテーブルでは発生していないことです。テーブルの違いがわかりません。

ヘルプ !! !

ありがとう。

注: これは SQL Server 2008 R2 です

4

1 に答える 1

6

特にデータベース内の特定のテーブルでのみこの動作が見つかった場合は、トリガーが原因であることがほぼ確実です。

トリガーは、レコードがINSERTED、UPDATED、またはDELETED(これらのいずれかまたはすべて)のときに実行されるコードです。通常、トリガーはビジネスルールの実装、監査テーブルへの書き込みなどに使用されます。これは、多くのコードを書き直すことなく、アプリケーション全体にこの種の動作を普遍的に追加するための便利な方法です。もちろん、欠点は透明性の欠如です。トリガーは、実行されている、または存在していることを常に明確に示しているわけではありません。

Management Studioでツリーを展開する場合はtables、このように動作しているテーブルを1つ見つけて、さらに展開します。triggersテーブルに定義されているトリガーを確認するために展開できるというフォルダーがあります。

ここに画像の説明を入力してください

クエリを実行して、次のようなトリガーを一覧表示することもできます。

SELECT trigger_name = sysobjects.name, trigger_owner = USER_NAME(sysobjects.uid),table_schema = s.name, table_name = OBJECT_NAME(parent_obj),
  isupdate = OBJECTPROPERTY( id, 'ExecIsUpdateTrigger'), isdelete = OBJECTPROPERTY( id, 'ExecIsDeleteTrigger'),
  isinsert = OBJECTPROPERTY( id, 'ExecIsInsertTrigger'), isafter = OBJECTPROPERTY( id, 'ExecIsAfterTrigger'),
  isinsteadof = OBJECTPROPERTY( id, 'ExecIsInsteadOfTrigger'),
  [disabled] = OBJECTPROPERTY(id, 'ExecIsTriggerDisabled') 
FROM sysobjects INNER JOIN sysusers ON sysobjects.uid = sysusers.uid
    INNER JOIN sys.tables t 
        ON sysobjects.parent_obj = t.object_id
    INNER JOIN sys.schemas s 
        ON t.schema_id = s.schema_id
WHERE sysobjects.type = 'TR'

*このサイトから取得した画像:http ://www.mssqltips.com/sqlservertip/1380/disable-triggers-in-sql-server-2005/

于 2012-03-05T17:42:13.063 に答える