SQL Server 2005 根据行内日期限制更新或删除记录

ado*_*lot 4 replication trigger sql-server-2005 sql-server constraint

我有两个 SQL Server 之间的事务复制。出于测试目的,我在订阅者处删除了许多仍然存在于发布者处的记录。

我现在知道,如果有人在发布者处更新或删除了我的订阅者上不存在的一些记录,那么我的复制将会崩溃。

我知道我也可以在分发服务器上过滤数据,但这意味着重新初始化我的订阅者,这意味着通过慢速链接传输近 40GB。

因此,当我测试我订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。

为此使用触发器还是约束更好?

如何尽可能避免记录锁定?

Aar*_*and 6

除非更新实际尝试更改该列中的数据,否则约束无法控制 DML 操作。它当然无法控制删除,除非我们谈论的是表级约束,但我建议不要这样做。

大多数人使用这种类型的逻辑后触发器,但这意味着 (a) 尝试执行更改 (b) 如果它使您的逻辑失败,则将其回滚。为此,我更喜欢 INSTEAD OF 触发器。以下将只允许更新/删除属于您的日期范围内的行(当然,您必须用实际日期替换“日期范围”字符串),即使多行操作可能会影响某些行但不会影响其他行。

CREATE TRIGGER dbo.PreventUpdate_table_name
ON dbo.table_name
INSTEAD OF UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE t
      SET t.col = i.col
      FROM dbo.table_name AS t
      INNER JOIN inserted AS i
      ON t.key = i.key
      WHERE t.date_column >= 'acceptable date span start'
      AND t.date_column < 'acceptable date span end';
END
GO

CREATE TRIGGER dbo.PreventDelete_table_name
ON dbo.table_name
INSTEAD OF DELETE
AS
BEGIN
    SET NOCOUNT ON;

    DELETE t
      FROM dbo.table_name AS t
      INNER JOIN inserted AS i
      ON t.key = i.key
      WHERE t.date_column >= 'acceptable date span start'
      AND t.date_column < 'acceptable date span end';
END
GO
Run Code Online (Sandbox Code Playgroud)