代码之家  ›  专栏  ›  技术社区  ›  Jeremy

在sql中强制执行有效日期记录

  •  1
  • Jeremy  · 技术社区  · 15 年前

    假设我有一个名为“name”的列的记录。每个记录都可以是有效日期,因此我还有一个有效日期和一个到期日期列。

    “名称”列必须是唯一的,但只能在生效日期和到期日期的重叠期间内。我正在寻找一种有效的方法,从sql后端(我使用ms sql 2008)中强制执行此操作。

    2 回复  |  直到 15 年前
        1
  •  4
  •   D'Arcy Rittich    15 年前

    你会用一个 INSERT/UPDATE trigger 为此。

    这一页上的示例c与您需要的类似。 Inserted 是一个伪表,可用于将插入/更新的记录联接回表,以查看是否有日期重叠的其他记录,

        2
  •  0
  •   srini.venigalla    15 年前

    这是数据模型

    Table A (
    
    name char (32) not null,
    effdt date not null,
    effseq int not null,
    effstatus char (1) not null,
    
    other data columns ..
    
    )
    

    主键a_key(name,effdt,effseq);

    数据如下:

    'A', '1/1/2009', 1, 'A', 'Otherdata'
    'A', '1/1/2009', 2, 'A', 'Otherdata 2'
    'B', '1/1/2009', 1, 'A', 'B data'
    'B', '1/1/2009', 2, 'I', 'B Data'
    

    规则如下:

    使用effdt存储该行应使用或生效的日期。这可能不是存储/创建数据的日期。

    使用effseq在任何日期存储多个更新。它应该总是从1开始。

    使用effstatus停用数据。不要删除有效日期架构中的数据。删除也使审计工作变得困难。

    当您“更新”一行时,不要更新effdt列。总是用new effdt创建一个新行。如果effdt已经存在,使用下一个effseq。

    最好将updateuserid和updatetimestamp也存储在行中。尤其是如果你想跟踪变化。

    以下是问题:

    要获取所有数据:

    Select * from A
    

    要获取截至今天的所有“活动行”:

    Select * from A A1
    where effdt = (select max (EFFDT) from A where name= A1.name 
                                          and effdt <= getdate())
    and effseq = (select max(effseq) from A where name=A1.name and effdt=A1.effdt)
    and eff_status = 'A'
    

    要获取给定日期以前/将来的所有行:

    将getDate()替换为上面的实际日期。

    如果您正在编写Web应用程序,以下是表单字段规则:

    插入形式:

    EFFDT : Editable, Default Value = Today
    EFFSEQ : Non Editable, Default Value = "#Next". 
    Interpret what is "Next" in the backend.
    

    更新表单:

    EFFDT : Editable, Default= current Value.
    EFFSEQ : Non-Editable, Default = "#Next" 
    

    删除窗体:

    All data non editable, On Delete Action, set EFF_STATUS='I'
    

    历史记录编辑:

    This is a "super user" feature only. 
    EFFDT = Non Editable, Default is Current Date
    EFFSEQ = Non-Editable, Default is Current Value
    

    所有其他字段都可以编辑,并对行进行真正的更新。