2017-02-23 73 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

相关问题