是否可以将SQL Server 2005表中的列强制为某个值,而不管insert或update语句中使用的值是什么?基本上,我无法访问的应用程序中存在一个错误,即尝试将日期1/1/0001插入日期时间列。这产生了一个SqlDateTime溢出异常。由于此列甚至不用于任何内容,我想以某种方式更新数据库中的列或某些内容的约束以避免错误。这显然只是一个临时的紧急补丁来避免这个问题......欢迎提示...
答案 0 :(得分:4)
如何插入值?如果它是通过存储过程...您可以修改Sproc以忽略该输入参数。
如果它是通过客户端生成的SQL,或者是ORM工具,otoh,那么afaik,唯一的选择是“Before”触发器,用可接受的“替换”值......
答案 1 :(得分:3)
如果您使用的是SQL 2005,则可以创建一个INSTEAD OF触发器。 此触发器中的代码将运行而不是原始插入/更新
-Edoode
答案 2 :(得分:2)
我创建一个trigger来检查并更改值
答案 3 :(得分:1)
如果它是第三方应用程序,那么我将假设您无权访问存储过程,或用于生成和插入该值的逻辑(仍然值得检查应用程序数据库的SP,但是,如果你可以修改它们。)
正如Charles建议的那样,如果不可以访问源代码,那么您需要在插入内部触发。
Microsoft文章here将为您提供有关创建触发器的一些深入信息。
但是,SQL Server没有真正的'before insert'触发器(据我所知),所以你需要尝试INSTEAD OF。有关详细信息,请查看here。在该文章中,特别注意第37.7节和以下示例(再次来自该文章):
CREATE TRIGGER T_InsertInventory ON CurrentInventory
INSTEAD OF INSERT AS
BEGIN
INSERT INTO Inventory (PartNumber, Description, QtyOnOrder, QtyInStock)
SELECT PartNumber, Description, QtyOnOrder, QtyInStock
FROM inserted
END
尼克。
答案 4 :(得分:0)
最简单的黑客就是将其变为varchar,并将其作为字符串插入到列中。
更复杂的答案是,您可以使用触发按摩数据,但它仍然必须首先有效。例如,我可以在更新/插入触发器中重置字段值,但它仍然必须首先通过插入。