美好的一天。我试图在SQL Server中创建一个内部触发器。我希望触发器基于列中的更新文本更改来执行。我希望列更改有条件。例如,我希望在(列名称)从Scheduled
更改为Queued
时激活触发器,反之亦然。如果列更改为Complete
或其他文本;我不希望触发器发生。
我的代码如下。谢谢
ALTER TRIGGER [WIP].[Trigger] ON [WIP].[Roaster]
AFTER INSERT, update, delete
AS
if update (roastprofile)
select status
from wip.Roaster
where status = 'scheduled' and status != 'Complete' and status = 'Queued'
update controls.TriggerUpdate
set TriggerNumber = triggernumber + 1
答案 0 :(得分:4)
晚上好,
我想知道你的逻辑。
首先,您只是在寻找更新,对吗? 如果是这样,请从触发器定义中删除FOR INSERT和DELETE。
其次,由于您不熟悉触发器,因此我让他们了解插入和删除的表格。 删除只有一个非空的已删除表格,而插入只有一个非空的已插入表格。
另一方面,更新了两个表都填写了。记录集的前后值。我说记录集可能是多个记录。
http://technet.microsoft.com/en-us/library/ms191300.aspx
第三,请不要将触发器命名为保留字触发。
第四,我不明白roastprofile是如何发挥作用的。您只是在寻找可以在两个选定对之间翻转状态的更新。满足该组合时,您需要更新触发器。
最后但并非最不重要的是,已删除和插入的表可能有多个记录。您需要在键值(pk)上加入它们。我添加了一个假设的.id,你需要改变它。
另外,我将加入记录和测试组合的结果保存到临时表中。然后查询该表,并通过命中数更新触发号码。
我不知道这是否符合您的业务逻辑;但是,它修复了我在设计中看到的缺陷。
-- Delete the existing trigger.
IF EXISTS (select * from sysobjects where id = object_id('CustomCode')and type = 'TR')
DROP TRIGGER [WIP].[CustomCode]
GO
-- Create the new trigger.
CREATE TRIGGER [WIP].[CustomCode] on [WIP].[Roaster]
FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION
AS
BEGIN
-- declare local variable
DECLARE @MYMSG VARCHAR(250);
DECLARE @MYCNT INT;
-- nothing to do?
IF (@@rowcount = 0) RETURN;
-- do not count rows
SET NOCOUNT ON;
-- deleted data
IF NOT EXISTS (SELECT * FROM inserted)
BEGIN
SET @MYMSG = 'DELETE ACTION'
RETURN;
END
ELSE
BEGIN
-- inserted data
IF NOT EXISTS (SELECT * FROM deleted)
BEGIN
SET @MYMSG = 'INSERT ACTION'
RETURN;
END
-- updated data
ELSE
BEGIN
SET @MYMSG = 'UPDATE ACTION'
-- get the status before and after
SELECT
CASE
WHEN LOWER(del.status) = 'scheduled' AND LOWER(ins.status) = 'queued' THEN 1
WHEN LOWER(del.status) = 'queued' AND LOWER(ins.status) = 'scheduled' THEN 1
ELSE 0
END AS FLAG
INTO
#MyTemp
FROM
inserted as ins JOIN deleted as del ON ins.id = del.id;
-- Total number of conditions satisfied
SELECT @MYCNT = SUM(FLAG) FROM #MyTemp;
-- your business logic
update controls.TriggerUpdate
set TriggerNumber = TriggerNumber + @MYCNT;
END
RETURN;
END
END
GO