【问题标题】:Ensure endDate equal to or later than startDate确保 endDate 等于或晚于 startDate
【发布时间】:2013-04-23 21:25:24
【问题描述】:

我有一张表,我需要确保startDate 不迟于endDate

可以更新任一日期,因此无论输入/修改 startDateendDate(或两者),都必须应用规则。

使用触发器、存储过程或其他方式更好吗?任何示例语法表示赞赏。

【问题讨论】:

  • 如果这是 .net、php、coldfusion 等任何应用程序的一部分,您可以使用应用程序代码来阻止尝试更新。
  • @DanBracuk 但是如果用户在应用程序之外运行临时更新怎么办?数据完整性逻辑应该尽可能接近数据——如果你想在别处添加冗余逻辑以便更早地捕获它,很好,但是离数据越远,它的效率就越低......跨度>

标签: sql sql-server sql-server-2008 stored-procedures triggers


【解决方案1】:

使用检查约束。比触发器简单得多。

CREATE TABLE dbo.foo
(
  StartDate DATE NOT NULL,
  EndDate   DATE NOT NULL,
  CONSTRAINT CheckEndLaterThanStart CHECK (EndDate >= StartDate)
);

如果表已经存在:

ALTER TABLE dbo.foo
  ADD CONSTRAINT CheckEndLaterThanStart
  CHECK (EndDate >= StartDate);

如果您尝试插入晚于结束日期的开始日期,您会得到:

消息 547,第 16 级,状态 0,第 1 行
INSERT 语句与 CHECK 约束“CheckEndLaterThanStart”冲突。冲突发生在数据库“AdventureWorks2012”、表“dbo.foo”中。
声明已终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多