您可能會考慮的一種替代機制是添加另一個表,稱爲LockedValues。我有點從您的敘述不能確定什麼值你想防止更改,但這裏有一個例子:
表T
,包含兩列,ID
和Val
:
create table T (
ID int not null,
Val int not null,
constraint PK_T PRIMARY KEY (ID),
constraint UK_T_Lockable UNIQUE (ID,Val)
)
而且我們有3行:
insert into T(ID,Val)
select 1,10 union all
select 2,20 union all
select 3,30
我們要防止一行ID
2,從有它Val
改變:
create table Locked_T (
ID int not null,
Val int not null,
constraint UQ_Locked_T UNIQUE (ID,Val), --Only really need an index here
constraint FK_Locked_T_T FOREIGN KEY (ID,Val) references T (ID,Val)
)
insert into Locked_T (ID,Val) select 2,20
所以現在,當然,任何應用程序,只知道的T
將無法與ID
2編輯該行,但可以自由地改變行1和3
這樣做的好處是,強制代碼已經內置到SQL Server中,因此可能非常有效。您不需要Locked_T
上的唯一密鑰,但它應該被編入索引,以便能夠快速檢測到值不存在。
這一切都假定你要編寫一個觸發器,拒絕的變化,而不是一個恢復變化。爲此,你仍然需要編寫一個觸發器(儘管我仍然建議擁有這個單獨的表格,然後編寫觸發器來執行內部更新inserted
與Locked_T
- 這應該仍然非常有效)。
(但被警告,:即恢復的變化是邪惡的觸發器)
一個寫得很好的觸發應該不會造成太大* *太多額外的開銷(如果你是緊張的工作表現,你可能會失敗其他原因很快)。但是無法過濾觸發器。 –