Ich habe zwei Tabellen (OrderFreshGoods und OrderUtensils) und dann habe ich eine AuditTrail-Tabelle. Die AuditTrail-Tabelle bezieht sich auf die OrderFreshGoods-Tabelle, aber ich möchte sie so ändern, dass sich ein Audit entweder auf einen OrderFreshGoods- oder OrderUtensils-Datensatz beziehen muss. Ich habe viele Lösungen gesehen, bei denen die Audit-Tabelle 2 Fremdschlüssel (OrderIDFresh, OrderIDUtensils und es ist optional, dass 1 von ihnen ausgefüllt werden muss) hat. Beachten Sie, dass ich diese Lösung nicht möchte. Ich möchte, dass die Audit-Tabelle einen Fremdschlüssel (OrderID) hat und sich entweder auf OrderFreshGoods.OrderID oder OrderUtensils.OrderID bezieht.Fremdschlüssel zu 1 von mehreren Tabellen
Auch meine zwei Reihenfolge Tabellen haben keine Felder gemeinsam und werden in einer großen Anzahl von Abfragen rund um das System verwendet, so dass ich nicht eine übergeordnete Tabelle für beide Arten der Bestellung wollen.
Kann jemand helfen? Mein SQL-Skript unten ist, sollten die Kommentare helfen meinen Tests zu erklären ...
--Setup tables
create table OrderFreshGoods (OrderID int not null primary key, sellBy date, name varchar(20))
go
create table OrderUtensils (OrderID int not null primary key, requiresOver18CheckForKnives bit, colour varchar(20), title varchar(20))
go
create table AuditTrail (AuditId int not null primary key, OrderID int, timeOfEvent date, eventDescription varchar(100))
go
--Base data
insert into OrderFreshGoods values (7, DATEADD(dd, 3, getdate()), 'Organic milk')
insert into OrderUtensils values (8, 0, 'Red', 'Garlic crusher')
--Test data!!!!!!!!!!!!!!
--This should work
insert into AuditTrail values (15, 7, getdate(), 'Logging order for Organic Milk from Corkys Coffee shop.')
--This should work
insert into AuditTrail values (16, 8, getdate(), 'Logging order for a Red Garlic Crusher from Perrys Pizza Place.')
--This should not be allowed
insert into AuditTrail values (17, 9, getdate(), 'Wrongly adding an audit entry before the order, please stop me now!')
--This should not be allowed
insert into AuditTrail values (18, null, getdate(), 'Oh dear, bad code has caused the OrderId to be lost, please stop me now!')
Ich würde hier mit einer Trigger-basierten Lösung gehen. – jarlh