代码之家  ›  专栏  ›  技术社区  ›  jordan

将SQL Server列强制为特定值

  •  1
  • jordan  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  1
  •   Nick    16 年前

    如果它是第三方应用程序,那么我假设您没有访问存储过程或用于生成和插入该值的逻辑(不过,检查应用程序数据库的SP是否可以修改它们仍然是值得的)。

    查尔斯建议,如果你 不要 有权访问源,然后您需要在插入时有一个触发器。

    微软文章 here 将提供一些关于创建触发器的深入信息。

    但是,据我所知,SQL Server没有真正的“插入前”触发器,因此您需要尝试而不是。看一看 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
    

    尼克。

        2
  •  4
  •   Charles Bretana    16 年前

    如何插入值?如果通过存储过程…您可以修改存储过程以忽略该输入参数。

    如果是通过客户端生成的SQL或ORM工具Otoh,然后是Afaik,那么唯一的选项是“before”触发器,它用可接受的值“替换”该值…

        3
  •  3
  •   edosoft    16 年前

    如果您使用的是SQL 2005,那么可以创建一个INSTEADOF触发器。 此触发器中的代码将运行而不是原始的插入/更新

    -爱德华

        4
  •  2
  •   Diadistis    16 年前

    我会创造一个 trigger 检查和更改值

        5
  •  0
  •   DevelopingChris    16 年前

    最简单的方法是将其设置为varchar,并将其作为字符串插入到列中。

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