Sql server MSSQL触发器-在插入时更新新插入的记录
如果SELECT语句返回的值大于0,我希望对插入到我的表CustomerContact中的行设置修改集Deleted=1 我有以下几点,但它仍然没有经过测试:Sql server MSSQL触发器-在插入时更新新插入的记录,sql-server,triggers,sql-update,sql-insert,last-insert-id,Sql Server,Triggers,Sql Update,Sql Insert,Last Insert Id,如果SELECT语句返回的值大于0,我希望对插入到我的表CustomerContact中的行设置修改集Deleted=1 我有以下几点,但它仍然没有经过测试: CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact AFTER INSERT AS BEGIN DECLARE @numrows INT; /* Determine if order matches criteria for marking customer c
CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact
AFTER INSERT AS
BEGIN
DECLARE @numrows INT;
/* Determine if order matches criteria for marking customer contact as DELETED immediately */
SELECT @numrows = COUNT(*)
FROM [Order] o
JOIN OrderMeterDetail om
ON o.OrderID = om.OrderID
WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409)
AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4)
AND o.orderid IN (SELECT OrderID FROM INSERTED);
/* If the order matches the criteria, mark the customer contact as deleted */
IF (@numrows >= 1)
UPDATE CustomerContact
SET Deleted = 1
WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED);
END
在IF语句中,我使用FROM INSERTED,假设这将返回insert创建的记录的新插入id
关于这一声明,我有两个问题:
语句的这一部分是否仅对记录执行更新
刚刚插入CustomerContact的
更新CustomerContact
设置已删除=1
其中CustomerContactID在选择CustomerContactID FROM INSERTED
根据SELECT语句的结果对刚插入的行进行更改时,这样做是否正确
CustomerContactID是一个自动递增的主键列。您说的只是插入的记录。插入的记录可以包含多个记录。如果只有一个,那么您的触发器将按照您的预期工作。但如果不止一个,就不会了 我会把你的逻辑改写成一个更新语句
Update CustomerContact
Set Deleted = 1
From CustomerContact
inner join inserted on CustomerContact.CustomerContactID = inserted.CustomerContactID
inner join orders on inserted.OrderID = orders.OrderID
where
-- some criteria.
我认为您可以这样做,调整代码以进一步满足需要,希望这会有所帮助。以下是我用来解决此问题的最终解决方案:
CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact
AFTER INSERT AS
BEGIN
UPDATE CustomerContact
SET Deleted = 1
FROM CustomerContact cc
JOIN inserted i
ON cc.CustomerContactID = i.CustomerContactID
JOIN [Order] o
ON i.OrderID = o.OrderID
JOIN OrderMeterDetail om
ON i.OrderID = om.OrderID
WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409)
AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4)
END
有没有办法为每一行执行触发器?好主意!我会给出一个例子,你能解释一下,如果插入了多行,为什么最初的OP尝试不起作用吗?我看不到,他在插入的SELECT orderid中设置@numrows where o.orderid查找@numrows>=1,并在插入的SELECT CustomerContactID中更新where CustomerContactID它到底会在哪里失败?当然,使用连接的语法更漂亮@DrCopyPaste,因为如果一条记录与where条件匹配,那么所有记录都将被标记为已删除,而不是仅与条件匹配的记录。@PODLUSKA非常感谢您的帮助。我已经发布了一个潜在的解决方案。如果您能快速浏览一下,看看您的想法,我将不胜感激,对不对谢谢你抽出时间来看看我的问题+1.
CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact
AFTER INSERT AS
BEGIN
UPDATE CustomerContact
SET Deleted = 1
FROM CustomerContact cc
JOIN inserted i
ON cc.CustomerContactID = i.CustomerContactID
JOIN [Order] o
ON i.OrderID = o.OrderID
JOIN OrderMeterDetail om
ON i.OrderID = om.OrderID
WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409)
AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4)
END