这是一个简单的例子。
我想在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()
为UID
和DateTimeStamp
,INSERTED
表会在DatetimeStamp字段中包含Datetime-Of-Insertion吗?这意味着,我最初没有输入Serial,GUID或DatetimeStamp中的任何一个,它们是否会出现在INSERTED表中?
编辑2:
你能指出我关于触发器的好书/文章。我读过掌握SQL Server 2005,没有得到太多的帮助。谢谢!
答案 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)
如果您无法控制插入源,请使用触发器。如果您确实可以控制插入源,那么您可以修改插入过程以添加辅助表行。
您是否也可以控制未来的插页?如果为此表创建了另一个插入,该怎么办?如果使用触发器,则辅助插入也将自动处理。如果没有,则第二次插入过程可能会遗漏第二次插入。根据你的申请,这可能是好事还是坏事。