假设我有一个名为“Name”的列的记录。每条记录都可以生效,因此我也有一个生效日期和到期日期栏。
“名称”列必须是唯一的,但仅限于生效日期和到期日的重叠期间。我正在寻找某种有效的方法来在sql后端执行此操作(我使用的是ms sql 2008)。
答案 0 :(得分:4)
您可以使用INSERT/UPDATE trigger。
该页面上的示例C与您需要的类似。 Inserted
是一个伪表,您可以使用它将插入/更新的记录连接回您的表,以查看是否有任何其他日期重叠的记录,
答案 1 :(得分:0)
这是数据模型
Table A (
name char (32) not null,
effdt date not null,
effseq int not null,
effstatus char (1) not null,
other data columns ..
)
Primary_Key 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列。始终使用新的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
所有其他字段都可以编辑,并对该行进行真正的更新。