困难的时态跨表数据库约束

WCW*_*din 1 sql-server constraints crosstab database-agnostic temporal

我有一个特别困难的业务约束,我想在数据库级别强制执行.这些数据本质上属于财务数据,因此必须保护其不存在与第n度的不一致 - 不要信任业务层.我稍微松散地使用"时间"这个词,这意味着我打算控制一个实体如何能够随着时间而改变.

对细节进行着色,这是设计:

  • 发票可以收取几笔费用.
  • 在创建发票后不久,费用将分配给发票.
  • 发票到达流程中的一个阶段,然后"锁定".
  • 从现在开始,不会向此发票添加或删除任何费用.

这是一个精简的数据定义:

CREATE TABLE Invoices
(
    InvoiceID INT IDENTITY(1,1) PRIMARY KEY,
)

CREATE TABLE Fees
(
    FeeID INT IDENTITY(1,1) PRIMARY KEY,
    InvoiceID INT REFERENCES Invoices(InvoiceID),
    Amount MONEY
)
Run Code Online (Sandbox Code Playgroud)

您会注意到发票的"可锁定"性质未在此处表示; 如何表达它 - 以及它是否需要直接表示 - 仍然是一个悬而未决的问题.

我开始相信这是那些无法转换为域密钥正常形式的安排之一,尽管我可能错了.(毕竟,真的没有办法说出来.)尽管如此,我仍然对高度规范化的解决方案抱有希望.

我碰巧在SQL Server 2008上实现了这个(语法可能是一个暗示),但我是一个好奇的人,所以如果有其他DBMS的解​​决方案,我也很想听到这些.

Eri*_*ich 9

我无法想象通过规范化来实现这一目标的方法.但是,如果我想在数据库上限制它,我会做两种方式之一:

首先,我会在Invoices中添加一个"锁定"列,这有点像某种类型,只是一种将其锁定为锁定的方法.

那么,有两种方式:

  1. 如果所引用的发票被锁定,则"插入前"触发器会在插入之前抛出错误.
  2. 在创建费用的存储过程中执行此逻辑.

编辑:我找不到一篇关于如何做其中一篇的MSDN文章,但IBM有一篇在SQL Server中运行良好的文章:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index .JSP?主题=/sqlp/rbafybeforesql.htm