在表“dbo.terms”中创建存储过程后,使用此代码在其中插入数据:
CREATE PROCEDURE dbo.terms
@Term_en NVARCHAR(50) = NULL ,
@Createdate DATETIME = NULL ,
@Writer NVARCHAR(50) = NULL ,
@Term_Subdomain NVARCHAR(50) = NULL
AS
BEGIN
SET NOCOUNT ON
INSERT INTO dbo.terms
(
Term_en ,
Createdate ,
Writer ,
Term_Subdomain
)
VALUES
(
@Term_en = 'Cat' ,
@Createdate = '2013-12-12' ,
@Writer = 'Fadi' ,
@Term_Subdomain = 'English'
)
END
GO
我想在其中创建Trigger
以在表dbo.term_prop
中添加其他行
我使用了这段代码:
CREATE TRIGGER triggerdata
AFTER INSERT
ON dbo.terms
FOR EACH ROW
BEGIN
INSERT INTO dbo.term_prop VALUES
('قطة', term_ar, upper(:new.term_ar) , null , 'chat', term_fr, upper(:new.term_fr) , null ,'Animal', Def_en, upper(:new.Def_en) , null ,'حيوان', Def_ar, upper(:new.Def_ar) , null ,'Animal', Def_fr, upper(:new.Def_fr) , null);
END;
它显示错误
答案 0 :(得分:1)
要添加更多行,您可以使用SELECTED表。
这是一个特殊的表格,其中填充了在您的交易中插入的行。
一个例子是:
INSERT INTO dbo.term_prop VALUES
SELECT * FROM inserted
所以你不能使用FOR EACH ROW。
触发器的正确定义是
CREATE TRIGGER triggername ON table AFTER INSERT
AS BEGIN
END
答案 1 :(得分:0)
Joe回答很好,这是一个更好的建议。
避免触发,它们可能导致维护噩梦:是维护和调试的技巧。 如果要在插入第一个表后插入另一个表中的表,只需将该代码放在同一个SP中。
如果您需要自动标识生成的值,可以使用@@ identity或scope_identity()或ident_current()来完成。
尽量保持简单。
答案 2 :(得分:0)
哇,我仍然感到惊讶的是,触发器被赋予糟糕的包裹!我很久以前就写了十几篇文章......
与生活中的任何事物一样,触发器的使用取决于具体情况。
1 - 触发器非常适合跟踪DDL更改。谁改变了那张桌子?
2 - 触发器可以跟踪DML更改(插入,更新,删除)。但是,在具有大事务编号的大型表上,它们可能会降低处理速度。
然而,对于今天的硬件,对我来说缓慢的事情对你来说可能并不慢。
3 - 触发器非常适合跟踪登录和/或服务器更改。
所以,让我们回到中心,谈谈你的情况。
您为什么要尝试仅对插入操作进行重复输入?
SQL Server Engine解决此问题的其他选项是:
1 - 通过自定义作业将数据从表1移动到表2。 “插入表1,从表2中选择*,其中etl_flag = 0;”。当然使它成为事务性的并在插入完成后更新标志。我只是考虑插入没有删除或更新。
2 - 如果您只想跟踪更改,请查看更改数据捕获。它从事务日志中读取。它不像触发器那样瞬间,即 - 不会为每个记录触发。只需在后台作为SQL代理作业运行即可加载cdc.tables。
3 - 将数据从一个server1.database1.table1复制到server2.database2.table2。
ETC ......
我希望我的帖子提醒大家情况决定解决方案。
触发器在某些情况下很好,否则,它们很久以前就会从产品中删除。
如果情况发生变化,那么解决方案可能需要改变......