_[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
_
多くの人がコメントしているように、トリガーを分離して起動し、必要な場合にのみ変更する必要があります。これは、挿入されたレコードのみをフィルター処理する必要があることを意味します。これは、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