我创建了一个触发器,如果[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
视图执行此操作。正如您将从下面的示例代码中看到的那样,我稍微修改了您的代码以更容易地查看发生了什么并将更新语句隔离为仅影响插入的行。