我在两个 SQL Server 之间进行事务复制。出于测试目的,我删除了订阅者的许多记录,这些记录仍然存在于发布者。
我现在知道,如果有人在发布者处更新或删除了一些记录,而这些记录在我的订阅者上不存在,那么我的复制就会崩溃。
我知道我也可以在分发服务器上过滤数据,但这意味着要重新初始化我的订阅者,这意味着要通过慢速链接传输近 40GB 的数据。
因此,在我测试订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。
为此使用触发器或约束更好吗?
如何尽可能避免记录锁定?
除非更新实际尝试更改该列中的数据,否则约束无法控制 DML 操作。除非我们谈论表级约束,否则它当然无法控制删除,但我建议不要这样做。
对于这种类型的逻辑,大多数人都使用后触发器,但这意味着 (a) 尝试执行更改 (b) 如果它使您的逻辑失败,则将其回滚。为此,我更喜欢 INSTEAD OF 触发器。以下将只允许更新/删除属于您的日期范围内的行(当然您必须将“日期范围”字符串替换为实际日期),即使多行操作可能影响某些行而不影响其他行。