对于创建这种场景的Microsoft SQL Server设置或数据库结构,您可以做些什么?
正如评论中提到的,你可能写的触发器写得很差。示例场景:
CREATE TABLE aud(column2 INT, comment NVARCHAR(150));
CREATE TABLE tab(column1 INT, column2 INT);
INSERT INTO aud(column2) VALUES (1),(2),(3);
INSERT INTO tab(column1, column2) VALUES (0,1),(-1, 2), (-2,3);
GO
CREATE TRIGGER trg_tab_i ON tab
FOR UPDATE
AS
BEGIN
UPDATE aud
SET comment = 'Changed value ...'
WHERE column2 = (SELECT column2 FROM inserted);
END
GO
UPDATE tab
SET column1 = 1
WHERE column2 in (1,2);
消息512,级别16,状态1,过程trg_tab_i,5号线[批量起始行19]
子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。
UPDATE tab
SET column1 = 1
WHERE column2 in (1);
-- (1 row(s) affected)
-- (1 row(s) affected)
DBFiddle Demo
当只有一行受到影响,一切正常。
你的表是否有更新触发器?我猜测它的确如此,并且它假定“插入”或“删除”只有一行。 –
所以......你应该碰到PK违规的唯一方法是如果Column1是复合PK或PK本身的一部分。查询看起来很简单:如果在同一元组的column2中发现值(1)或(2),请更新column1并将其设置为(1)。我猜测你的测试数据库有你的产品不同的起始记录。你可以将生产值复制到测试数据库并再次运行? – Milan
@Milan你是如何从“子查询返回多个值”到“PK违规”的? – HABO