在UPDATE语句中需要显式值吗?

时间:2011-08-25 18:10:31

标签: sql sql-server tsql

有没有办法,使用触发器或其他方法,确保在更新行时始终显式设置特定字段,即使通过SQL Server Management Studio运行即席SQL?具体来说,我们的表都有change_note字段,我们总是希望为每次更新设置该字段。我们考虑过并放弃的事情:

  1. 将change_note设置为NOT NULL。我们这样做,但没有帮助。一旦change_note有一个初始值,你就可以运行任意数量的UPDATE语句,忘记更新change_note,并且NOT NULL仍然很高兴,因为之前的值仍然位于change_note中。

  2. 使用触发器将旧版本的change_note与change_note的新值进行比较。有时您希望change_note与以前一样。我们并不想确保change_note发生变化,我们希望确保在任何更新中明确提供它的值。

  3. 拒绝运行临时SQL的权限,并强制每个人只通过我们的存储过程API更新数据,并使change_note成为更新相关表的所有SP的必需参数。我们有太多的临时查询需求。

  4. 难倒!有什么想法吗?

    谢谢!

5 个答案:

答案 0 :(得分:4)

您可以在触发器主体中使用Update()函数。它将检查触发触发器的语句是否试图更改列上的值:

if Update(column)
    --do whay you want;BEGIN....END;

您可以在以下网址找到有关它的更多信息:

http://msdn.microsoft.com/en-us/library/ms187326.aspx

http://msdn.microsoft.com/en-us/library/aa258254(v=sql.80).aspx

答案 1 :(得分:1)

触发器可以完成这项工作(确保你编写它来处理多个记录插入/更新)。但是,你的第一点和第二点似乎与我相互排斥。如果not null不够好,你怎么知道哪些需要改变?你有某种商业规则吗?

答案 2 :(得分:0)

使用#2并处理更新触发器中的“有时”部分。

答案 3 :(得分:0)

要求所有用户通过将更新的值插入另一个表(其中change_note为NOT NULL)来执行更改,并使用触发器复制值?

答案 4 :(得分:0)

相关问题