2013-04-25 79 views
0

我需要确保我的某个列的条目可以称为CreationDate is = <当前日期。使列值小于或等于当前日期

没有试图利用这个

CHECK (CreationDate =< GETDATE()) 

对于这篇文章提到的原因后:我想知道 CHECK constraint on date of birth?

我将如何编写SQL Server中的触发器,将检查日期我尝试插入/更新= <的currentdate

我从来没有使用过的触发器,我想出了这一点,但我不知道是否行得通,不然怎么会被调用。 我试图让触发器返回一个错误,以便程序员被迫检查或修复这个问题。

CREATE TRIGGER CheckValidDateTrigger 
ON Reports 
INSTEAD OF 
UPDATE 
AS  
DECLARE @ReportCloseDate DateTime; 

    IF (@ReportCloseDate > GETDATE()) 
    BEGIN 
    RAISERROR ('Error, the date your trying to save cannot be higher or newer that the current date. The date must be in the past or be the current date', -- Message text. 
       16, -- Severity. 
       1 -- State. 
       ); 
    END; 

你们能帮我一下吗?

+0

[此问题](http://stackoverflow.com/questions/15803002/date-cannot-be-in-the-future-sql)在最后一个答案中有一个类似的触发器样本。 – Alexander 2013-04-25 20:27:30

+2

您是否试过'CHECK(CreationDate 2013-04-25 20:28:07

+0

应该先测试一下,然后再问是否有效对不起 – Termiux 2013-04-25 20:40:00

回答

1

文档说任何表达式,其值为TRUE或FALSE:

CHECK约束通过限制 由一个或多个列接受的值执行域的完整性。您可以使用逻辑运算符上的任何逻辑(布尔)表达式创建CHECK约束 ,该表达式返回TRUE或FALSE,基于 。

对非确定性函数(就是说,对于同一个调用可能在不同时间返回不同值的函数)没有限制(据我发现)。

您指向的示例标记为Oracle。它还提供了一个替代解决方案,即添加一个默认值为getdate()的列并检查该列。

因此,您的check约束如预期应该工作。

+0

在询问之前应该先测试一下,是的,它的工作很抱歉 – Termiux 2013-04-25 20:40:43

+0

@Gordon - 当你说“volatile”时,你实际上是指非确定性的。同样,写入的检查约束也不起作用 - '= <'与<='不一样。这些表格中只有一个是有效的。 – 2013-04-25 20:41:08

+0

@AaronBertrand指出,我确实解决了这个问题 – Termiux 2013-04-25 20:42:04

相关问题