3

我们有大量具有相同架构的数据库,每个数据库都有一个带有触发器的表,用于将记录与中央数据库中的另一个表同步。当表被更新、插入或删除时,中央数据库中的表也有更新、插入或删除的记录。

我们一直在让记录神秘地从中央数据库的表中消失。在研究这个问题时,我发现当插入/删除触发器触发时,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)
4

1 回答 1

0

您可能已经这样做了,但是如果不应该删除记录,那么我会绕过数据库(或也编写一个脚本)并检查包含删除语句的触发器只触发插入和删除..也许有一个胭脂触发器在更新时触发并执行删除命令?

这是一个长镜头..

除此之外,我会检查链中没有其他触发器可以从中央数据库表中删除。

触发器设计似乎没有明显问题

于 2013-07-02T09:49:04.617 回答