我们有大量具有相同模式的数据库,每个数据库都有一个表,其中包含触发器,用于将记录与中央数据库中的另一个表同步。当表更新,插入或删除中央数据库中的表时,还会更新,插入或删除记录。
我们一直在神秘地从中央数据库的表中消失记录。在研究问题时,我发现当插入/删除触发器触发时,deleted
表中的记录不是来自当前的删除语句。它们甚至不是同一数据库中的记录。它们看起来像是另一个数据库中同一个表上的更新语句的旧值记录。
我能找到的所有信息都说deleted
表中的记录应来自导致触发器触发的语句。
任何人都可以解释为什么我会看到这种行为吗?
编辑:这是插入/删除触发器的样子:
DECLARE @TenantID INT
SELECT @TenantID = ID FROM [CentralDB]..Tenants WHERE db = DB_Name()
INSERT INTO [CentralDB].[dbo].[TenantUsers]
(..snipped list of columns...)
SELECT
...snipped list of columns...
FROM inserted
WHERE UserNameID NOT IN (0,6)
DELETE FROM [CentralDB]..TenantUsers WHERE UserNameID in
(SELECT UserNameID FROM DELETED WHERE UserNameID NOT IN (0,1,6))
更新触发器:
DECLARE @TenantID INT
SELECT @TenantID = ID FROM [CentralDB]..Tenants WHERE db = DB_Name()
UPDATE [CentralDB].[dbo].[TenantUsers]
SET ...snipped list of columns...
FROM INSERTED i
WHERE i.UserNameID = TenantUsers.UserNameID
AND i.UserNameID NOT IN (0,6)
答案 0 :(得分:0)
你可能已经完成了这个但是如果删除的记录不应该是那么我会绕过数据库(或者也写一个脚本)并检查包含delete语句的触发器只会触发插入和删除..也许有一个胭脂触发器在更新时触发并执行删除命令?
它是一个很长的镜头..
除此之外,我会检查链中没有其他触发器可以从中央数据库表中删除。
触发器设计似乎没有明显的问题