数据库触发器:插入时

时间:2011-11-23 12:14:57

标签: sql sql-server sql-server-2008 triggers

这是一个简单的例子。

我想在Table1 (Name, Age, Sex)中插入数据。此表在插入数据时自动增加serial#(int)。

我想在Table1 insert上设置一个触发器,这样在插入数据后,它会从serial#中获取Table1(int)并放置Serial#和{{ 1}} Name以及Table2中的Serial#some other data

是否可以通过触发器?

或者,我应该从Table3中选择(最后)序列并通过手动增加来调用其他表格,在table1我曾经SP插入Table1吗?

哪种方法更好?

编辑1:
假设表:

Serial | UID | Name | Age | Sex | DateTimeStamp
(int | uniqueidentifier | nvarchar | smallint | nchar | DateTime ) 

默认NewID()和默认GetDate()UIDDateTimeStampINSERTED表会在DatetimeStamp字段中包含Datetime-Of-Insertion吗?这意味着,我最初没有输入Serial,GUID或DatetimeStamp中的任何一个,它们是否会出现在INSERTED表中?


编辑2: 你能指出我关于触发器的好书/文章。我读过掌握SQL Server 2005,没有得到太多的帮助。谢谢!

4 个答案:

答案 0 :(得分:4)

当然,您可以使用触发器执行此操作 - 例如:

CREATE TRIGGER trg_Table1_INSERT
ON dbo.Table1 AFTER INSERT 
AS BEGIN
   INSERT INTO dbo.Table2(SerialNo, Name)
      SELECT SerialNo, Name
      FROM Inserted

   INSERT INTO dbo.Table3(SomeOtherCol)
      SELECT SomeOtherCol
      FROM Inserted
END

或者你需要做什么......

重要的是要理解触发器将被称为每个语句 - 每行插入一次。因此,如果您有一个插入10行的语句,您的触发器将被称为一次,伪表Inserted将包含已在语句中插入的那10行。

答案 1 :(得分:2)

是的,这可以通过触发器实现。

当您使用INSERT触发器时,您可以访问代表要插入的行的INSERTED逻辑表,并使用新ID的值。

答案 2 :(得分:1)

是的,可以通过触发器,但请记住,TRIGGER不接受任何输入并且不提供任何输出,因此您只能通过查询触发器来收集所需数据,但是要满足插入你的Table2和Table3

CREATE TRIGGER tr_YourDesiredTriggerName ON Table1
 FOR INSERT
 AS
 BEGIN
    -- Inserting data to Table2
INSERT INTO Table2( Serial, Name) 
   SELECT i.Serial, i.Name 
       FROM Table1 AS t1 INNER JOIN Inserted AS i ON t1.Serial = i.Serial
       AND i.Serial NOT IN  ( SELECT t2.Serial FROM Table2 AS t2 )

    -- Inserting data to Table3     
INSERT INTO Table3( Serial, OtherData)  -- select from other table
   SELECT i.Serial, OtherData
       FROM OtherTable AS ot INNER JOIN Inserted AS i ON ot.Serial = i.Serial
       AND i.Serial NOT IN ( SELECT t3.Serial FROM Table3 AS t3 )
END

答案 3 :(得分:0)

如果您无法控制插入源,请使用触发器。如果您确实可以控制插入源,那么您可以修改插入过程以添加辅助表行。

您是否也可以控制未来的插页?如果为此表创建了另一个插入,该怎么办?如果使用触发器,则辅助插入也将自动处理。如果没有,则第二次插入过程可能会遗漏第二次插入。根据你的申请,这可能是好事还是坏事。

相关问题