带有IDENTITY_INSERT的SQL触发器

时间:2017-10-12 17:58:10

标签: sql-server triggers

我有两张表:Table1是所有公司,Table2是名称以A开头的公司。

  • 表1 company (companyId int, companyName varchar(50), companySize int)

  • 表2 companyStartWithA (companyId int, companyName varchar(50), companySize int)

我想要做的是创建一个触发器,以便当我在Table1中插入/更新/删除某些内容时,它会自动在Table2中执行相同的操作

我的代码:

CREATE TRIGGER A_TRG_InsertSyncEmp 
ON company
AFTER INSERT 
AS
BEGIN
    INSERT INTO companyStartWithA 
        SELECT *
        FROM INSERTED
        WHERE inserted.companyName LIKE 'A%'
END

我收到错误:

  

表' companyStartWithA'中的标识列的显式值只能在使用列列表且IDENTITY_INSERTON时指定。

我该怎么办?

由于

1 个答案:

答案 0 :(得分:1)

问题在于,您明确指定INSERT语句中的列,并使用SELECT *填充数据。两者都是大禁忌 - 您应该始终明确指定要插入的列,并且始终明确指定您想要的列选择。这样做可以解决这个问题:

CREATE TRIGGER A_TRG_InsertSyncEmp 
ON company
AFTER INSERT 
AS
BEGIN
    INSERT INTO companyStartWithA (companyName, companySize)
        SELECT companyName, companySize
        FROM INSERTED
        WHERE inserted.companyName LIKE 'A%'
END

但正如Sean Lange绝对正确评论 - 这应该真的只是一个视图而不是一个单独的表.....

CREATE VIEW dbo.CompanyStartsWithA
AS 
    SELECT companyId, companyName, companySize
    FROM dbo.Company
    WHERE Name LIKE 'A%'

然后你不需要任何杂乱的触发器或任何东西 - 只需插入dbo.Company,所有名称以A开头的公司都会在此视图中显示...