2014-04-14 140 views
1

当从titles_in_stock表中删除一行时,我想在名为titles_in_stock_out的表中插入等效行。删除后创建触发器

我尝试以下

create trigger titles_in_stock_out 
    on titles_in_stock 
    after delete as 
    begin 
     insert into titles_in_stock_out 
     (cd_title, invenotry, cd_type) 
     values 
     (deleted.cd_title, deleted.invenotry, deleted.cd_type) 
    end 

但是这给试图执行上述语句时,下面的错误。

消息128,级别15,状态1,过程titles_in_stock_out,第8行
名称 “deleted.cd_title” 并不在此上下文中允许的。有效的 表达式是常量,常量表达式和(在某些 上下文中)变量。列名不被允许。

任何帮助?

谢谢

回答

6

您的语法不正确。 deleted是触发器中可用的虚拟表,那么您必须将其作为表引用。

create trigger titles_in_stock_out 
    on titles_in_stock 
    after delete as 
    begin 
     insert into titles_in_stock_out 
     (cd_title, invenotry, cd_type) 
     select cd_title, invenotry, cd_type 
     from deleted 
    end 

这对于删除多行的情况会有所帮助。

+0

试过及获得跟随着错误消息2714,级别16,状态2,过程titles_in_stock_out,5号线 已经有一个名为 'titles_in_stock_out' 中的对象数据库。 – Lalu

+0

尝试了你的建议,但得到这个错误。消息2714,级别16,状态2,过程titles_in_stock_out,行5 数据库中已有一个名为'titles_in_stock_out'的对象。 – Lalu

+1

您的数据库中已经有名称为'titles_in_stock_out'的对象。您可以更改触发器的名称,或者如果它是触发器,则可以使用“更改触发器”而不是“创建触发器”。 –

0
create trigger titles_in_stock_out 
     on titles_in_stock 
     FOR delete 
     begin 
    insert into titles_in_stock_out 
     (cd_title, invenotry, cd_type) 
     select 
     cd_title, invenotry, cd_type 
     from deleted 
     end 
1

你需要参考deleted作为表,并且触发器还需要有不同的名称;在你的例子中,它与表格名称相同。

create trigger titles_in_stock_out_trig 
    on titles_in_stock 
    after delete as 
    begin 
     insert into titles_in_stock_out 
     (cd_title, invenotry, cd_type) 
     select 
     cd_title, invenotry, cd_type 
     from deleted 
    end 
+0

'titles_in_stock'与'titles_in_stock_out'不同。 –

+0

@HamletHakobyan否,但它与目标表相同,并且会得到对象名称冲突。 – jpw

+0

好的,你说得对。 –

-1

这应该解决您的问题:

IF OBJECT_ID('titles_in_stock_out', 'TR') IS NOT NULL 
DROP TRIGGER titles_in_stock_out 
GO 
CREATE TRIGGER titles_in_stock_out 
ON titles_in_stock 
FOR DELETE 
AS 
BEGIN 
     INSERT INTO titles_in_stock_out 
     (cd_title, invenotry, cd_type) 
     VALUES 
     (cd_title, invenotry, cd_type) 
     SELECT 
     cd_title, invenotry, cd_type 
     FROM titles_in_stock 
END 
+0

您可以在同一个insertn中使用values子句和select子句 – HLGEM