防止向字段写入NULL或空白

时间:2016-08-17 14:12:56

标签: sql sql-server triggers constraints

我已经做了很多搜索和测试,但我似乎找不到这样的例子,或者让我的任何测试都能正常工作。

我有许多字段的表,它们从NULL开始(意味着数据未知),当它们获取数据时,数据永远不是空字符串。一些反复更新数据以反映快照的更新脚本非常复杂,有时会使用NULL或空值覆盖值。这些脚本超出了我们现在真正修复的能力,所以我想采取另一种方法,并防止在存在数据时使用NULL或空白的字段更新。

1 个答案:

答案 0 :(得分:1)

我在使用MySQL之前已经完成了这类工作,但从未使用过SQL Server,所以我的语法可能略有偏差。基本要点是在表上设置触发器,并在更新发生后对所有已删除的行运行UPDATE-JOIN(更新涉及DELETE和INSERT)。 deleted表是与触发器相关的特殊对象,我们可以使用它来获取旧值。如果nullColumn中的旧值为NULL,则触发器会将新值设置为NULL,同时丢弃可能已进行的任何更改。

CREATE TRIGGER nullKeep
  ON nullTable
AFTER UPDATE
AS
  BEGIN
    SET NOCOUNT ON;

    UPDATE a
    SET 
        nullColumn1 = CASE WHEN b.nullColumn1 IS NULL THEN NULL ELSE a.nullColumn1 END
      , nullColumn2 = CASE WHEN b.nullColumn2 IS NULL THEN NULL ELSE a.nullColumn2 END
      , nullColumn3 = CASE WHEN b.nullColumn3 IS NULL THEN NULL ELSE a.nullColumn3 END
    /* ...repeat for as many columns as you need... */
    FROM 
        nullTable a
    INNER JOIN 
        deleted b
        ON  a.ID = b.ID
  END
GO