Sql 触发“而不是删除”,它能工作吗?

Sql 触发“而不是删除”,它能工作吗?,sql,triggers,Sql,Triggers,我想做的是: 如果id为教师,则不能删除其工资,否则可以删除 我运行此程序并获得以下两个结果: 无法在没有允许的情况下删除!! 1行受影响 我的触发器是否工作?您有两个单独的DELETE语句。第一个可能没有执行,但是第二个在任何开始/结束对之外,这就是删除行的原因 完全删除第二个delete,以及下一行的where。您的触发器设计不当。在任何情况下,都不要假定删除或插入的伪表中只有一条记录。永远不要将id的值设置为标量变量。如果删除了20条记录,那么只有一条会受到触发器其余代码的影响。触发器是基

我想做的是:

如果id为教师,则不能删除其工资,否则可以删除

我运行此程序并获得以下两个结果:

无法在没有允许的情况下删除!! 1行受影响 我的触发器是否工作?

您有两个单独的DELETE语句。第一个可能没有执行,但是第二个在任何开始/结束对之外,这就是删除行的原因


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

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

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

写一个delete语句从表中删除。确保它删除多个记录,并且您从select语句中准确地知道哪些记录需要删除,哪些不需要删除。 运行它 检查您期望的触发器操作是否发生,记录是否被删除

您应该知道如何做到这一点,而不必去互联网上找出自己的代码是否工作

您的逻辑有点奇怪,如果子记录存在,通常您不想删除父记录,而不是FK所做的那样。您需要先删除子记录才能删除父记录,除非您使用级联删除,这是一种可怕的做法,即使您可能会遇到此问题,您应该测试触发器以查看删除教师时会发生什么情况,因此,如果触发器按照您的意图操作,则可能会在维护数据时出现问题

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)