Jedním ze způsobů, jak to vyřešit, by bylo přidat do databáze tabulku, která by fungovala jako základ pro ostatní tabulky a propojit ji vztahem jedna ku jedné k ostatním tabulkám, a pak připojit tabulku událostí k této základní tabulce.
To vám umožní zachovat integritu dat pro každou z tabulek.
Základní tabulka může být tak jednoduchá jako jeden sloupec, nebo může mít sloupce, které mají všechny ostatní tabulky společné, čímž se implementuje určitý druh " dědičnost“ ve vaší datové struktuře.
Vytvořte základní tabulku (za předpokladu, že mezi ostatními tabulkami nejsou žádné společné sloupce):
CREATE TABLE TblObjectBase
(
ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
)
Potom pro jakoukoli jinou tabulku, na kterou je třeba odkazovat pomocí ObjectId
v Events
tabulka:
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)
)
Jediné, co zbývá, je vložit novou hodnotu do TblObjectBase pro jakékoli vložení na vaše ostatní tabulky. Toho lze snadno dosáhnout buď uloženými procedurami, nebo místo triggerů vložení.
Procedura vložení může vypadat takto:
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...)
Spouštěč namísto vložení by vypadal takto:
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
Pokud se rozhodnete použít místo insert, skutečnost, že hodnota Identity pochází z jiné tabulky, by měla být pro klienta (váš program vb.net) transparentní.