これを解決する1つの方法は、データベースにテーブルを追加して他のテーブルのベースのように機能させ、他のテーブルと1対1の関係で接続してから、イベントテーブルをこのベーステーブルに接続することです。
これにより、各テーブルのデータの整合性を維持できます。
ベーステーブルは、1つの列のように単純にすることも、他のすべてのテーブルに共通する列を含めることもできます。これにより、一種の「データ構造の「継承」。
ベーステーブルを作成します(他のテーブル間に共通の列がないと仮定します):
CREATE TABLE TblObjectBase
(
ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
)
次に、ObjectId
によって参照される必要がある他のテーブルの場合 Events
で テーブル:
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)
)
残っているのは、他のテーブルに挿入するためにTblObjectBaseに新しい値を挿入することだけです。これは、ストアドプロシージャによって、または挿入トリガーの代わりに簡単に実現できます。
挿入プロシージャは、次のようになります。
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...)
挿入トリガーの代わりに次のようになります:
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
挿入の代わりに使用することを選択した場合、Identity値が別のテーブルから取得されるという事実は、クライアント(vb.netプログラム)に対して透過的である必要があります。