【发布时间】:2018-02-01 18:23:47
【问题描述】:
我有一个 SQL Server 表,其中包含学生、同类群组、课程、毕业日期和状态。一些学生的记录是专门绑定在一起的——如果某一行的队列发生变化,则状态为 2 的另一行的队列也需要更改。在大多数情况下,我以编程方式捕捉到这一点,但有很多方法可以改变学生的队列,所以我们错过了一些。
基本上如果有人运行第一行更新语句,第二行也需要运行
UPDATE StudentPrograms
SET Cohort = 201610
WHERE Student = 'A1234' AND Program = 'MBA' AND Cohort = 201510
UPDATE StudentPrograms
SET Cohort = 201610
WHERE Student = 'A1234' AND Cohort = 201510 AND Status = 2
我想在表上放置一个更新触发器以更改两个同类群组,但问题是我无法弄清楚如何同时捕获标识需要更改的记录的起始同类群组和它将要更改的同类群组需要更改为。一旦更新运行并触发触发器,我所拥有的就是更新的队列,所以我不知道要更改哪条记录。
CREATE TRIGGER [dbo].[tr_SP_Cohort]
ON [dbo].StudentPrograms
AFTER UPDATE
AS
DECLARE @student VARCHAR(10);
DECLARE @cohort INT;
SELECT @student = i.student FROM inserted i
SELECT @cohort = i.cohort FROM inserted i
SET NOCOUNT ON;
IF UPDATE(Cohort)
UPDATE dbo.StudentPrograms
SET Cohort = @cohort
WHERE Student = @student AND Status = 2 AND Cohort = ???
不幸的是,由于很多原因,记录必须在此表中,而不是子表中。记录偶尔也会被删除/重新插入,所以如果我通过添加另一个带键的字段将它们绑定在一起,我会遇到同样的问题 - 如果该记录被删除/更新/重新插入,我仍然需要捕获信息,记录它,然后记录变化。
感谢您的即时帮助!这就是我最终得到的结果,稍作更改,因此它适用于批量更新。
ALTER TRIGGER [dbo].[tr_SP_Cohort]
ON [dbo].StudentPrograms
AFTER UPDATE
AS
SET NOCOUNT ON;
IF UPDATE(Cohort)
UPDATE a
SET Cohort = i.Cohort
FROM dbo.StudentPrograms AS a
INNER JOIN inserted AS i ON a.Student = i.Student
INNER JOIN deleted AS d ON a.Cohort = d.Cohort
AND a.Student = d.Student
WHERE a.Status = 2
【问题讨论】:
-
尝试从已删除查询。更新时,原始记录被移动到删除中,新值存储在插入中。
-
完美!谢谢!
-
不客气。
-
另一个关于批量更新和触发器的堆栈溢出帖子 (stackoverflow.com/questions/32324871/…)
标签: sql sql-server triggers