更改 SQL Server 2012 中检查约束中使用的标量 UDF

Rob*_*tin 1 sql-server-2012 functions check-constraints

我对使用标量 UDF 的列有一个检查约束。我有一个需要对 UDF 进行更改的要求。根据我所知,我需要删除约束,对 UDF 进行更改,然后重新添加约束。在删除约束期间,我担心可能会向表中插入坏数据。有没有办法在不放弃约束的情况下更改 UDF?如果没有,有没有办法防止坏数据进入表中?

Eri*_*ing 5

你不应该

当您将标量 UDF 放入计算列或检查约束时,您会遇到两个问题:

  • 接触表的查询将无法生成并行查询计划(更多详细信息请参见此处
  • 如果它们没有被持久化或索引,它们将在处理查询所需的每行执行一次

在可能的情况:

  • 在函数外部使用纯 T-SQL 进行计算(如果所有列都在一个表中,则可以)
  • 编写一个触发器来捕获不应放入表中的行
  • 使用不同类型的约束(外键等)来捕获表中不应存在的行

脚本化的

/*A table*/
CREATE TABLE
    dbo.bad_idea
(
    id int PRIMARY KEY IDENTITY,
    some_date date
);
GO 

/*A silly function*/
CREATE FUNCTION
    dbo.please_do_not
(
    @some_date date
)
RETURNS bit
AS
BEGIN
      RETURN 
      (
          CASE 
              WHEN @some_date < '19000101' 
              THEN 0 
              ELSE 1 
          END
      );
END;
GO 

/*A bad idea for a check constraint*/
ALTER TABLE
    dbo.bad_idea
WITH CHECK
ADD CONSTRAINT  
    god_no 
CHECK 
(
    dbo.please_do_not(some_date) = 1
);
GO 

/*An updated silly function*/
CREATE FUNCTION
    dbo.please_i_beg_you_do_not
(
    @some_date date
)
RETURNS bit
AS
BEGIN
      RETURN 
      (
          CASE 
              WHEN @some_date < '19800101' 
              THEN 0 
              ELSE 1 
          END
      );
END;
GO 

/*Another bad idea*/
ALTER TABLE
    dbo.bad_idea
WITH CHECK
ADD CONSTRAINT  
    god_no 
CHECK 
(
    dbo.please_do_not(some_date) = 1
);
GO 

/*An equally bad idea*/
ALTER TABLE
    dbo.bad_idea
WITH CHECK
ADD CONSTRAINT  
    god_no_please
CHECK 
(
    dbo.please_i_beg_you_do_not(some_date) = 1
);
GO 

/*Drop the old one off*/
ALTER TABLE
    dbo.bad_idea
DROP CONSTRAINT
    god_no;
Run Code Online (Sandbox Code Playgroud)