どのように請求書を作成していますか?たとえば、SAPは注文ヘッダとその詳細を請求書と請求書の詳細にコピーするだけで、注文に必要なものはすべて実行できますが、請求書は同じままです。個人的には、基本的に同じデータを2回保存しているので、それは良い解決策ではないと思います(実際には、私が正しく覚えていれば、それは最も悪いです - データは2、3、4、 。
非常に簡単な解決策の1つは、カスケード削除ではない外部キーを使用して請求書を注文詳細テーブルに追加することです。この方法では、請求書を作成するときに、オーダーの詳細にリンクします。注文明細テーブルからレコードを削除できないと、親レコードはordersテーブルから削除できません。私は私が何を意味するかをお見せするためにrextester上の簡単なデモを行った
- ここでは完全な例である(ケースrextesterには使用できません):
CREATE TABLE OrderHeader
(
id int identity(1,1) primary key,
createDate datetime
);
CREATE TABLE Invoice
(
id int identity(1,1) primary key,
createDate datetime,
OrderId int foreign key references OrderHeader(id)
);
CREATE TABLE OrderDetails
(
id int identity(1,1) primary key,
orderId int foreign key references OrderHeader(id) on delete cascade,
itemId int,
invoiceId int NULL foreign key references Invoice(id)
);
INSERT INTO OrderHeader (createDate) VALUES (DATEADD(DAY, -1, GETDATE())), (GETDATE());
INSERT INTO OrderDetails (orderId, itemId) VALUES (1, 1), (2, 2);
BEGIN TRANSACTION
INSERT INTO Invoice (createDate, OrderId) VALUES (GETDATE(), 1) ;
UPDATE OrderDetails
SET invoiceId = scope_identity()
WHERE OrderId = 1;
COMMIT TRANSACTION
SELECT 'Headers', * FROM OrderHeader;
SELECT 'Details', * FROM OrderDetails;
SELECT 'Invoice', * FROM Invoice;
DELETE FROM OrderHeader WHERE Id = 2;
SELECT 'Headers', * FROM OrderHeader;
SELECT 'Details', * FROM OrderDetails;
SELECT 'Invoice', * FROM Invoice;
DELETE FROM OrderHeader WHERE Id = 1;
私は右のそれを理解していれば、あなたは削除したいですOrderHeadersに削除がある場合の詳細から、別のテーブルにある投稿フラグに基づいて条件付きである必要がありますか? – Sujith
注文書が請求書に変換されるときに何か他のものが保存されていますか?もしそうなら、それはPostedカラムの代わりにOrderHeadersにFKを持たず、そのFKをカスケードしないでください。 –
@Sujith Postedフィールドは、OrderHeadersテーブル自体にあります。 –