触发“而不是删除”,它可以工作吗?

时间:2014-04-30 18:24:10

标签: sql triggers

ALTER Trigger tr_sal On salaries
Instead of delete 
AS  
  declare @id int
  set @id=(select id_teacher from deleted)
  if  @id in (select ID_teacher from techers)
  BEGIN 
    print 'not able !!'
  END
  ELSE
  BEGIN
    delete from salaries where id_teacher=@id
  END

  delete from salaries
  where id_teacher=???--(write id)

我想做什么:

如果id是老师,你不能删除他/她的工资,否则你可以删除。

我运行这个并得到两个:

  1. 没有津贴就无法删除!!
  2. (1行(s)受影响)
  3. 我的触发器是否正常工作?

2 个答案:

答案 0 :(得分:0)

您有两个单独的DELETE语句。第一个可能没有执行,但第二个(任何BEGIN / END对之外的那个)是,那就是删除该行。

完全删除第二个delete from salaries,以及下一行的where

答案 1 :(得分:0)

你的触发器设计很差。从不在任何情况下假设在已删除(或已插入)的伪记录中只有一条记录。您永远不应将id的值设置为标量变量。如果删除了20条记录,那么只有一条记录会受到触发器其余代码的影响。触发器是基于SQL Server设置的,它们不是逐行运行的。这是您需要解决的第一件事。并且不要将print语句置于触发器中,它们是无用的。如果某些记录应该被删除而其他记录不应该被删除,你还需要了解触发器的工作方式。

现在要知道你的触发器是否正常工作,你需要进行单元测试。

写一个删除语句以从表中删除。确保它删除了多条记录,并且您从选择的规则中确切地知道您希望删除哪些记录以及哪些记录不被删除。 运行 检查触发器发生的操作是否发生以及是否删除了记录。

您应该知道如何执行此操作,而不必访问Internet以确定您自己的代码是否有效。

你的逻辑有点奇怪,通常你不想删除父记录,如果子记录不是相反的存在(这是FK所做的)。你需要首先删除子记录才能删除父记录(除非你使用级联删除,这是一个可怕的做法,即使你可能遇到这个问题,你应该测试你的触发器,看看当你删除教师时会发生什么) ,因此,如果数据符合您的预期,您的触发器可能会导致维护数据出现问题。