日安。我正试图在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发布于 2013-11-19 01:50:47
晚上好,
我在想你的逻辑。
首先,你只是在寻找更新,对吗?如果是,则从触发器定义中删除FOR插入和删除。
第二,由于您对触发器是新手,所以我把它们留在这里,教您如何插入和删除表。delete只有一个非空的已删除表,而insert只有一个非空插入表。
另一方面,更新中的两个表都已填写完毕。记录集的前后值。我说记录集,因为它们可能是多个记录。
http://technet.microsoft.com/en-us/library/ms191300.aspx
第三,请不要将触发器命名为保留字触发器。
第四,我不明白烤面包是怎么起作用的。您只是在寻找在两个选定的对之间翻转状态的更新。当该组合满足时,您需要更新触发器。
最后但并非最不重要的是,删除和插入的表可能有多个记录。您将需要在键值(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
GOhttps://stackoverflow.com/questions/20061086
复制相似问题