對於創建這種場景的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