我有两张表: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_INSERT
为ON
时指定。
我该怎么办?
由于
答案 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
开头的公司都会在此视图中显示...