Sql 设置表中不可更新字段的约束或任何其他解决方案

Sql 设置表中不可更新字段的约束或任何其他解决方案,sql,asp.net,Sql,Asp.net,我在账单表中有一列订单id 一旦该订单id存在(表示不为空), 然后,它决不能再更新为NULL或任何其他值 我有一个巨大的错误,不知何故,使一些记录的这个值为空 1.我现在做QA 1个月,找不到哪个sp正在将字段更新为NULL。我涵盖了所有UI和业务逻辑,但什么也没找到。有没有更好的方法来找到将某个字段更新为null的方法 2.是否存在类似SQL way的约束,该约束在字段具有值时对其进行保护,如果有任何内容试图更新它,则会抛出错误。假设使用SQL Server,您可以尝试设置探查器跟踪吗?看见

我在账单表中有一列订单id 一旦该订单id存在(表示不为空), 然后,它决不能再更新为NULL或任何其他值

我有一个巨大的错误,不知何故,使一些记录的这个值为空

1.我现在做QA 1个月,找不到哪个sp正在将字段更新为NULL。我涵盖了所有UI和业务逻辑,但什么也没找到。有没有更好的方法来找到将某个字段更新为null的方法


2.是否存在类似SQL way的约束,该约束在字段具有值时对其进行保护,如果有任何内容试图更新它,则会抛出错误。

假设使用SQL Server,您可以尝试设置探查器跟踪吗?看见
例如,如果您不知道如何执行此操作:

我认为您需要一个触发器来强制执行此操作。那么该字段为什么可以为空?该网站很大,我甚至不知道将此触发器放置在何处,我找不到什么命令将值更新为空,如果我知道可以解决此问题的话。如何找到触发位置?该字段默认为空。一旦订单链接到账单,则订单必须始终链接到账单。发生的事情是它默认为空,而不是当它附加的时候它得到值而不是空,但是比一些未知的事情发生(通常在几天后)和它的更新为空再加上设计,在我看来我不知道下一次更新什么时候会发生,可能是几天,该表一直在更新,就像每周百万次的更新一样。我只需要保护一个字段(列)在其具有值where之后不可更新?怎样?也许我遗漏了一些我不理解的东西,为了设置触发器,我需要知道更新操作在代码中的什么地方完成,对吗?我不知道触发了什么,我不知道哪个sp更新了字段,projectNo中有1000多个sp!例如,请参见:表触发器类似于事件:当发生更新时,代码将自动执行。我不确定您是否能够找到有问题的过程,但至少您可以保护您的数据。好的,我将使用触发器,以及您建议在字段更新后执行什么操作?要记录sp名称?你能分享一下这个问题的建议触发方式吗?我的意思是如何设置触发,以及触发时该做什么。我使用的是sql 2008 R2,我不确定您是否可以这样做,抱歉。(我对触发器也不是很熟练。)我认为你能做的最好的事情就是“锁定”你的字段,不让它被更新,我试图给出一个例子。我认为这段代码会在字段[somevalue]有值时有效地“锁定”它:它只允许在当前值为NULL时进行更新。但如果您的表很大,我不确定它的性能。1723 SP之间必须只有1或2个更新此字段。您有没有建议搜索此sp的方法?与搜索特定表上的任何操作和特定字段检查表依赖项(Sql Server Management Studio->右键单击您的表->查看依赖项)的某些查询一样,这将列出依赖于此表的存储过程(以及其他依赖项),因此如果它们不太多,您可能会感到幸运。您也可以尝试这样的操作:从information\u schema.routines中选择*,其中例程定义为“%update%”,例程定义为“%table\u name%”,例程定义为“%field\u name%”,但这不能保证有效。也许还可以试一下扳机,毕竟我很想看看它是怎么回事:-)
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