强制SQL Server列为特定值

时间:2009-01-08 15:03:51

标签: sql-server-2005

是否可以将SQL Server 2005表中的列强制为某个值,而不管insert或update语句中使用的值是什么?基本上,我无法访问的应用程序中存在一个错误,即尝试将日期1/1/0001插入日期时间列。这产生了一个SqlDateTime溢出异常。由于此列甚至不用于任何内容,我想以某种方式更新数据库中的列或某些内容的约束以避免错误。这显然只是一个临时的紧急补丁来避免这个问题......欢迎提示...

5 个答案:

答案 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,并将其作为字符串插入到列中。

更复杂的答案是,您可以使用触发按摩数据,但它仍然必须首先有效。例如,我可以在更新/插入触发器中重置字段值,但它仍然必须首先通过插入。