ado*_*lot 4 replication trigger sql-server-2005 sql-server constraint
我有两个 SQL Server 之间的事务复制。出于测试目的,我在订阅者处删除了许多仍然存在于发布者处的记录。
我现在知道,如果有人在发布者处更新或删除了我的订阅者上不存在的一些记录,那么我的复制将会崩溃。
我知道我也可以在分发服务器上过滤数据,但这意味着重新初始化我的订阅者,这意味着通过慢速链接传输近 40GB。
因此,当我测试我订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。
为此使用触发器还是约束更好?
如何尽可能避免记录锁定?
除非更新实际尝试更改该列中的数据,否则约束无法控制 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)
归档时间: |
|
查看次数: |
1141 次 |
最近记录: |