2017-02-23 72 views
0

我有一列order_id在開票表 一旦此order_id存在(意味着不是NULL), 然後它不能再次更新爲NULL或任何其他值。設置約束或任何其他解決方案不能更新表

我有一個巨大的bug,以某種方式爲某些記錄NULL值。

1.我現在正在做1個月的QA,找不到sp將字段更新爲NULL。我涵蓋了所有的UI和業務邏輯,並沒有發現任何東西。有沒有更好的方法來找到什麼更新某些字段爲空?

2.是否存在SQL方式的約束,一旦它具有值就會將警衛放在字段上,並且如果有任何事情會嘗試更新它,將會拋出錯誤。

+0

我認爲你需要一個觸發強制執行這一點。 –

+0

爲什麼字段可以爲空? –

+0

該網站是巨大的,我什至不知道在哪裏把這個觸發器,我找不到什麼命令更新值爲null,如果我知道我會解決它。我怎麼找到觸發的地方? – Alexxx

回答

0
create table test2 (id int identity primary key, name varchar(20) not null, somevalue varchar(20)) 
GO 

create trigger test2_upd_trigger 
on test2 
after update as 
begin 
    update test2 set somevalue = coalesce(d.somevalue, i.somevalue) 
    from inserted i join deleted d on i.id = d.id 
    join test2 on test2.id = i.id 
end 
GO 

insert test2 (name) values ('Demo1') 
update test2 set somevalue = 'A value' where id = 1 -- This is allowed 
select * from test2 -- [somevalue] has been assigned a value 

update test2 set somevalue = null where id = 1 -- This is "rejected" by the trigger 
select * from test2 -- [somevalue] retains its value 
+0

我認爲這個代碼一旦有值就會有效地「鎖定」字段[somevalue]:只有當它的當前值爲NULL時,它才允許更新。但是如果你的桌子很大,我不確定它的表現。 –

+0

是表是巨大和沉重,並且頁面已經很慢:(在1723 SP之間的 – Alexxx

+0

必須只有1或2更新此字段。是否有一種方法,您建議搜索此sp?例如某些查詢可以搜索某個表和某個字段的任何操作 – Alexxx

0

假設SQL Server,你可以嘗試設置一個Profiler跟蹤嗎?見this link 例如,如果你不知道如何做到這一點:

+0

我不知道下次何時會發生此更新,可能是幾天,表格會每週更新一次,如每週更新數百次。我需要保護只有一個字段(列)不可更新後,它有一個值 – Alexxx

+0

然後設置一個觸發器,正如@Gordon Linoff已經建議。 –

+0

哪裏?怎麼樣?也許我錯過了一些我不明白的地方,爲了設置一個觸發器,我需要知道更新操作在代碼中的位置,對吧?我不知道什麼被觸發,我不知道什麼sp更新字段,有超過1000 sp在項目 – Alexxx

相關問題