Rob*_*tin 1 sql-server-2012 functions check-constraints
我对使用标量 UDF 的列有一个检查约束。我有一个需要对 UDF 进行更改的要求。根据我所知,我需要删除约束,对 UDF 进行更改,然后重新添加约束。在删除约束期间,我担心可能会向表中插入坏数据。有没有办法在不放弃约束的情况下更改 UDF?如果没有,有没有办法防止坏数据进入表中?
当您将标量 UDF 放入计算列或检查约束时,您会遇到两个问题:
在可能的情况:
/*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)