web-dev-qa-db-ja.com

テーブルにレコードが挿入または更新されたかどうかを確認する

_[name] <= 2_の長さが更新ステートメントを実行するトリガーを作成しました。このトリガーは98%の頻度で起動します。つまり、2%の割合でトリガーが起動しないと、レコードがUpdated()ではなくInserted()であったと考えられます。

これはサンプルDDLとトリガーですが、トリガー構文に問題はありますか?または、レコードが更新されたかどうかを判断する方法を検討する必要がありますか?

_Create Table TwoNumericNames
(
  name varchar(500)
)

Insert Into TwoNumericNames (name) Values
('AA'), ('RR'), ('CC'), ('MM'), ('EE')


CREATE TRIGGER trgUpdateName
ON [TwoNumericNames]
FOR INSERT
AS
Begin

UPDATE [TwoNumericNames]
SET [name] = CASE
                WHEN [name] LIKE '%AA%' THEN 'Alpha Awe'
                WHEN [name] LIKE '%RR%' THEN 'Raw Red'
                WHEN [name] LIKE '%CC%' THEN 'Capt Cree'
                WHEN [name] LIKE '%MM%' THEN 'My More'
                WHEN [name] LIKE '%EE%' THEN 'Ed Ewe'
            END 
WHERE LEN([name]) <= 2

END
_

[〜#〜]編集[〜#〜]
おそらくAfterInsert()トリガーの方がうまく機能します。これは設定方法ですか?

_Create Table TwoNumericNames
(
  id int,
  name varchar(500)
)

Insert Into TwoNumericNames (name) Values
(1,'AA'), (2,'RR'), (3,'CC'), (4,'MM'), (5,'EE')

CREATE TRIGGER [dbo].[trgUpdateName] ON [dbo].[TwoNumericNames] 
AFTER INSERT
AS 
BEGIN
  SET NOCOUNT ON;

  -- get the last id value of the record inserted or updated
  DECLARE @id INT
  SELECT @id = [Name]
  FROM INSERTED

  -- Insert statements for trigger here
  UPDATE [dbo].[TwoNumericNames] 
  SET [name] = CASE
                WHEN [name] LIKE '%AA%' THEN 'Alpha Awe'
                WHEN [name] LIKE '%RR%' THEN 'Raw Red'
                WHEN [name] LIKE '%CC%' THEN 'Capt Cree'
                WHEN [name] LIKE '%MM%' THEN 'My More'
                WHEN [name] LIKE '%EE%' THEN 'Ed Ewe'
            END 
  WHERE [id] = @id 

END
_
1
user2676140

多くの人がコメントしているように、トリガーを分離して起動し、必要な場合にのみ変更する必要があります。これは、挿入されたレコードのみをフィルター処理する必要があることを意味します。これは、insertedビューで行うことができます。以下のサンプルコードからわかるように、コードを少し変更して、何が起こっているのかをより簡単に確認し、更新されたステートメントを分離して、挿入された行にのみ影響を与えるようにしました。

--create the table
create table TwoNumericNames (rowID int IDENTITY, name nvarchar(500))

--insert a row
INSERT TwoNumericNames
VALUES (N'AA')

--note the row
select * from TwoNumericNames;
go

--create trigger
CREATE TRIGGER trgUpdateName
ON TwoNumericNames
FOR INSERT
AS
Begin

    UPDATE T
    SET T.[name] = CASE
                    WHEN I.[name] LIKE '%AA%' THEN 'Alpha Awe'
                    WHEN I.[name] LIKE '%RR%' THEN 'Raw Red'
                    WHEN I.[name] LIKE '%CC%' THEN 'Capt Cree'
                    WHEN I.[name] LIKE '%MM%' THEN 'My More'
                    WHEN I.[name] LIKE '%EE%' THEN 'Ed Ewe'
                    ELSE I.[name]
                END 
    FROM TwoNumericNames T
    JOIN inserted I ON I.rowID = T.rowID

END
go

--insert another row
INSERT TwoNumericNames
VALUES (N'RR')

--note only the one record is updated
select * from TwoNumericNames
1