【发布时间】:2021-11-05 20:02:09
【问题描述】:
在 SQL 服务器中,我有一个表 X 和一个表 Y。 两者的主键相同,例如 Z。 我创建了一个触发器,如果在 X 中创建/删除/更新任何内容,那么
- 如果 Y for Z 中不存在该条目,则创建一个新条目。
- 如果 Y 中存在针对 Z 的条目,则更新该行。
我运行了这样的查询:
Delete FROM Table2 where TId = 1;
此查询删除了 10 行,同时运行了 10 个触发器。由于所有触发器都并行运行,因此每个触发器都执行了 else 块,因为最初在 Y 中没有针对 Z 的条目,并且由于所有都在运行,所以它们不会在 Y 中找到行。因此,在 Y 表中创建了 10 行。
我希望只创建 1 个条目,而其他触发器应该更新该条目。
例如,我有表格:
Table1(TId PRIMARY KEY, C12, C13);
Table2(C21 PRIMARY KEY, TId FOREIGN KEY(Table1, C11), C23);
Table3(TId PRIMARY KEY, C32, C33);
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trg1] ON [dbo].[TABLE2] AFTER DELETE
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (SELECT * FROM Deleted D )
BEGIN
IF EXISTS (Select * from [dbo].[Table3] where TId in (Select TId from Deleted D) )
BEGIN
Update [dbo].[Table3] SET C32 = 1 where TId in (Select TId from Deleted D);
END
ElSE
BEGIN
INSERT INTO [dbo].[Table3]
(
TId,
C32,
C33
)
SELECT TId,
3,
GETUTCDATE()
FROM Deleted D WHERE TId is not null
SET NOCOUNT OFF
END
END
SET NOCOUNT OFF
END
PRINT '';
PRINT 'End of script';
PRINT ' --- // ---';
【问题讨论】:
-
您需要向minimal reproducible example 提供示例数据、预期结果和触发代码。
-
你误诊了你的情况。在 SQL Server 中,触发器每 组 受影响的行执行一次,所以不,您没有同时运行 10 个触发器。更有可能是您的触发器被错误地写入假设它一次只处理一行。
-
@DaleK 我已经用一个例子更新了这个问题。
标签: sql sql-server database tsql triggers