Sql-Server
根據 SQL Server 2005 行內的日期限制要更新或刪除的記錄
我有兩個 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