创建棘手的更新触发器

时间:2017-03-19 00:41:16

标签: sql sql-server tsql triggers dml

帮助!!我在我的智慧结束!!

我一直在尝试创建一个更新触发器,以便在更新时简单地将值插入到另一个表中。

TBL_PUPILS:

data.frame(datetimes1 = out,
           datetimes2 = names(out),
           row.names = NULL)
#        datetimes1       datetimes2
# 1 2014-07-24 05:05 2014-07-24 05:05
# 2             <NA> 2014-07-24 05:10
# 3 2014-07-24 05:15 2014-07-24 05:15
# 4 2014-07-24 05:23 2014-07-24 05:20
# 5 2014-07-24 05:27 2014-07-24 05:25
# 6 2014-07-24 05:33 2014-07-24 05:30
# 7 2014-07-24 05:37 2014-07-24 05:35
# 8 2014-07-24 05:41 2014-07-24 05:40
# 9 2014-07-24 05:45 2014-07-24 05:45

每个学生通过前5列的连接唯一地识别出困难。

我已成功设法创建INSERT TRIGGER;

Age               smallint
Height            smallint
Weight            smallint
Class             int
SurName           varchar(28)
Sick_Days         smallint

上面的插入触发器将用于捕获新学生加入时的日期时间等。

如果为现有学生修改病假天数,将如何创建类似的更新触发器?

如果您需要更多信息,请告诉我!!

1 个答案:

答案 0 :(得分:0)

@DanGuzman,@ GordonLinoff和@ZoharPeled在评论中提出了非常有效的观点。如果给出的示例确实是您的表结构并且您仍在设计系统,则需要仔细查看重组或将中断,并且可能更早而不是更晚。主要问题:学生不应该通过可以改变的字段在表格中识别

事实上,我很难为你解答这个问题,但数据库重新设计是另一个问题,所以这里有:

CREATE Trigger [dbo].[tr_tbl_Pupils_For_Update]
ON [dbo].[tbl_Pupils]
FOR UPDATE
AS   
BEGIN

update d
set d.Sick_Days = i.Sick_Days
from tbl_Pupil_Detail d
inner join inserted i 
  on d.Age = i.Age          -- bad: don't join on fields that could change!
  and d.Height = i.Height   -- bad
  and d.Weight = i.Weight   -- bad
  and d.Class = i.Class     -- bad
  and d.SurName = i.SurName -- bad

END

inserted表包含tbl_Pupils表中的所有更新行:请注意我是如何通过将inserted表与目标表({{}}相结合来完成更新语句的。 {1}})?如果在一个更新语句中更新tbl_Pupil_Detail中有多行,则会一次更新多个目标行。

这对于INSERT和UPDATE触发器都很重要,因为你永远不知道有人会尝试批量插入或更新记录 - 如上所述,将一行加载到变量中会失败。