Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 删除触发器出错_Sql Server_Tsql_Database Trigger - Fatal编程技术网

Sql server 删除触发器出错

Sql server 删除触发器出错,sql-server,tsql,database-trigger,Sql Server,Tsql,Database Trigger,此触发器应从父表中删除未从子表中删除的行。错误在下图中 我的代码尝试: CREATE TRIGGER ProductDeleted ON Product for DELETE AS BEGIN DELETE FROM OrderItem WHERE ProductID = (SELECT ProductID FROM DELETED) END 请帮帮我 您可以通过在外键约束上添加级联删除提示来简化它,例如 CREATE TABLE OrderItem (

此触发器应从父表中删除未从子表中删除的行。错误在下图中

我的代码尝试:

CREATE TRIGGER ProductDeleted ON Product 
for DELETE AS 
BEGIN 
     DELETE FROM OrderItem
     WHERE ProductID = (SELECT ProductID FROM DELETED)
END
请帮帮我


您可以通过在外键约束上添加级联删除提示来简化它,例如

 CREATE TABLE OrderItem
    (
     ID INT ,
     ProductID NOT NULL UNIQUE
        CONSTRAINT fk_Products 
           REFERENCES Products (ID) ON DELETE CASCADE
    );
因为已经有了一个表,所以只需删除约束并重新创建一个新的约束即可

ALTER TABLE OrderItem DROP
   CONSTRAINT fk_ProductID;

ALTER TABLE OrderItem ADD
   CONSTRAINT fk_ProductID
      FOREIGN KEY (ID)
      REFERENCES Product (ID)
      ON DELETE CASCADE;
这意味着,每当您从父表产品中删除记录时,OrderItem中的子记录也将被删除,因此您不必使用触发器,除非您想进行一些记录

如果你真的坚持使用触发器,那么你可以这样做:

ALTER TRIGGER ProductDeleted  on Product
INSTEAD OF DELETE AS
BEGIN
SET NOCOUNT ON;

/* First we are deleting referenced columns in OrderItem table */
DELETE FROM OrderItem 
where ProductID  IN (select deleted.ID /* Columns from product Table */ from deleted)

/* Now we are doing actual delete statement */
DELETE FROM Products where ID IN (select deleted.ID from deleted)
END

但是,你应该考虑使用级联删除,它更容易安装,更容易维护,并且每个表只能有一个而不是触发器,所以如果你需要做更有意义的事情,你就必须改变这个,并添加额外的开销。

在开始后,将SETNOCOUNT作为触发器主体中的第一件事添加

是,当我从产品表中删除一行时,我希望触发器自动删除与产品表关联的记录。如果此帮助替换where ID=select deleted.ID from deleted中的where ID IN select deleted.ID from deleted,请帮助我查看。删除的虚拟表将包含删除多行的DELETE语句的多行。您编写它的方式将导致子查询包含超过1行。。。这种情况下会出现错误。它不会返回错误,因为它将从OrderItem表中删除多行,但如果您传递多个ID以删除,则会删除多行,因此感谢提醒!