Sql 而不是删除触发器,以防止在满足条件时删除

Sql 而不是删除触发器,以防止在满足条件时删除,sql,sql-server,triggers,sql-delete,Sql,Sql Server,Triggers,Sql Delete,我正在尝试在我的电影数据库中的一个名为Cast的表上设置一个代替DELETE的触发器。如果CastFilmID计数大于2,我希望它能够防止删除一行 CREATE TRIGGER Prevent_Cast_Delete ON Cast INSTEAD OF DELETE AS WHERE COUNT CastFilmID > 2 RAISERROR ('Contains more than 2 cast memebers',16,1) ROLLBACK TRAN RETURN; 假设我说

我正在尝试在我的电影数据库中的一个名为Cast的表上设置一个代替DELETE的触发器。如果CastFilmID计数大于2,我希望它能够防止删除一行

CREATE TRIGGER Prevent_Cast_Delete ON Cast
INSTEAD OF DELETE 
AS
WHERE COUNT CastFilmID > 2
RAISERROR ('Contains more than 2 cast memebers',16,1)
ROLLBACK TRAN
RETURN;
假设我说,<代码>从《我在哪里》中的角色中删除('KEANU','JARAN','JESUS')——这试图从我们知道的每部电影中删除人。它将实现一个
已删除的
伪表:

Cast.ID, Cast.CastFilmID
KEANU, MATRIX
JARAN, MOBYDI
JESUS, null
左边是胶片计数:

Cast.ID, Cast.CastFilmID, CastCount
KEANU, MATRIX, 3
JARAN, MOBYDI, 1
JESUS, null, null
WHERE子句将基努从结果中删除,因为他在一部由3名演员(包括他自己)组成的电影中工作

删除了原始请求3的以下2条记录(
DELETE FROM cast WHERE ID IN)(…此列表…)

请注意,已对您的db做出以下假设:

  • 演员表有一个ID列,每个演员电影都是唯一的
  • CastFilmId是电影表中的ID,它会重复给在同一部电影上工作的每个人
  • 当一部电影的演员没有在该电影中出演(可能吗?)时,我假设他的CastFilmID为空。如果这永远不会为空,可以对查询进行一些简化,但在这种形式中,我希望演员没有被分配到电影中的记录仍然可以删除
这里需要注意的一点是,运行删除查询的人会在触发器中为您提供X行数;这些是该人试图删除的行,但您希望从该数据集之外获得额外的知识(例如,“有多少其他人与这些人在同一部电影上工作”)这就是为什么我们计算该影片的人数,将其加入被删除人的数据,然后决定是否删除该人


事实上,这种魔术应该在前端完成。当你告诉数据库删除某些内容时,事情会变得非常混乱,而它却没有。同样,你必须注意,删除查询一次可以删除数百行,因此你不能采取“删除只会尝试删除一行”的简单方法-您必须将这些内容作为数据集来处理,将它们与其他数据集连接起来,并提出一组要删除的数据

您的请求没有什么意义。您是否试图允许在任何给定的电影中最多删除一个人的语句?如果我执行了类似于
delete from cast where actor in('a','B','C')的语句
要从电影1中删除演员A和演员B,从电影2中删除演员C,则仅删除电影2(演员C)删除会成功?或者您的意思是,尝试从已经有2个以上演员的影片中删除任何人都不会成功?第二个,因此尝试从该影片有2个或更多演员的演员表中删除任何人都不会成功。其余的
在哪里选择
(或
更新
)声明
WHERE
子句也属于何处?这是什么DBMS?@stickybit SQLServer风格的syntaxWow,非常感谢您的介绍和详细解释。它工作起来很有魅力
Cast.ID, Cast.CastFilmID
KEANU, MATRIX
JARAN, MOBYDI
JESUS, null
Cast.ID, Cast.CastFilmID, CastCount
KEANU, MATRIX, 3
JARAN, MOBYDI, 1
JESUS, null, null
Cast.ID
JARAN
JESUS