SQL Server AFTER INSERT 触发器

kab*_*178 10 sql-server sql-server-2012

我希望married在使用marital_status列上的文本进行插入后触发此触发器,这是我目前所拥有的

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT [marital_status] FROM inserted) = 'married'
 BEGIN
     INSERT INTO [dbo].[applicant_marriage_info]([dom])
     VALUES('abc')
 END
END
Run Code Online (Sandbox Code Playgroud)

db2*_*db2 11

您将在这里遇到的问题来自于 SQL Server 没有 Oracle 具有的“FOR EACH ROW”触发器这一事实。您必须编写触发器来处理多行更改,即 INSERTED 或 DELETED 虚拟表中可以有不止一行。

如果发生这样的更新,您的触发器将失败,因为(SELECT [marital_status] FROM inserted)它将返回多行,并且子查询必须返回单个值以用于直接比较。

触发器可能看起来像这样:

CREATE TRIGGER [dbo].[marriage] ON  [dbo].[applicant_personal_info] FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON
    IF EXISTS (SELECT [marital_status] FROM INSERTED WHERE marital_status = 'married')
    BEGIN
        INSERT INTO [dbo].[applicant_marriage_info] ([dom])
        SELECT
            'abc' --Replace with whatever you're really inserting
        FROM INSERTED
        WHERE marital_status = 'married'
    END
END
Run Code Online (Sandbox Code Playgroud)


mrd*_*nny 8

所以这个触发器实际上非常接近你所需要的。现在这里的问题是,如果插入了任何行,那么只有一行会被插入到申请人_婚姻信息中。这是你真正想要的吗?如果一次插入多行会发生什么?

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    INSERT INTO [dbo].[applicant_marriage_info]([dom])
    SELECT 'abc' 
    FROM inserted 
    WHERE marital_status = 'married'
END
Run Code Online (Sandbox Code Playgroud)

您可能需要比我显示的更多的列。

  • 然后一种方法是用`BEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM added WHERE marital_status = 'married' END`替换最后一部分 (2认同)