帮助!!我在我的智慧结束!!
我一直在尝试创建一个更新触发器,以便在更新时简单地将值插入到另一个表中。
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
上面的插入触发器将用于捕获新学生加入时的日期时间等。
如果为现有学生修改病假天数,将如何创建类似的更新触发器?
如果您需要更多信息,请告诉我!!
答案 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触发器都很重要,因为你永远不知道有人会尝试批量插入或更新记录 - 如上所述,将一行加载到变量中会失败。