Ett sätt att lösa det skulle vara att lägga till en tabell i din databas för att fungera som en bas för de andra tabellerna och koppla den till en en till en relation till de andra tabellerna och sedan koppla händelsetabellen till den här bastabellen.
Detta kommer att tillåta dig att behålla dataintegriteten för var och en av tabellerna.
Bastabellen kan vara så enkel som bara en kolumn, eller kan ha kolumner som alla andra tabeller har gemensamma, och därmed implementera ett slags " arv" i din datastruktur.
Skapa bastabellen (förutsatt att inga gemensamma kolumner mellan andra tabeller):
CREATE TABLE TblObjectBase
(
ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
)
Sedan för alla andra tabeller som behöver refereras av ObjectId
i Events
tabell:
CREATE TABLE TblClients
(
Client_Id int PRIMARY KEY,
Client_FirstName varchar(10),
Client_LastName varchar(10),
-- Other client related data
CONSTRAINT FK_TblClients_TblObjectBase
FOREIGN KEY(Client_Id)
REFERENCES TblObjectBase(ObjectBase_Id)
)
CREATE TABLE TblInvoices
(
Invoice_Id int PRIMARY KEY,
-- other incoice related data
CONSTRAINT FK_TblInvoices_TblObjectBase
FOREIGN KEY(Invoice_Id)
REFERENCES TblObjectBase(ObjectBase_Id)
)
Det enda som återstår är att infoga ett nytt värde i TblObjectBase för valfri infogning på dina andra tabeller. Detta kan enkelt uppnås med antingen lagrade procedurer eller istället för infogningsutlösare.
En infogningsprocedur kan se ut så här:
CREATE PROCEDURE Insert_TblClients
(
@Client_FirstName varchar(10),
@Client_LastName varchar(10),
-- any other client related data you might have
)
AS
DECLARE @ClientId int
-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;
-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();
-- Insert the data to the clients table:
INSERT INTO TblClients
(Client_Id, Client_FirstName, Client_LastName.....) VALUES
(@ClientId, @Client_FirstName, @Client_LastName...)
En utlösare istället för att infoga skulle se ut så här:
CREATE TRIGGER TblClients_IO_Insert ON TblClients INSTEAD OF INSERT
AS
BEGIN
DECLARE @ClientId int
-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;
-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();
INSERT INTO TblClients
(Client_Id, Client_FirstName, Client_LastName.....)
SELECT @ClientId, Client_FirstName, Client_LastName.....
FROM inserted
END
Om du väljer att gå med istället för infogning, bör det faktum att Identity-värdet kommer från en annan tabell vara transparent för klienten (ditt vb.net-program).