Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Гъвкав външен ключ

Един от начините да го разрешите би бил да добавите таблица към вашата база данни, която да действа като основа за другите таблици и да я свържете с връзка едно към едно с другите таблици и след това да свържете таблицата на събитията към тази базова таблица.
Това ще ви позволи да запазите целостта на данните за всяка от таблиците.
Базовата таблица може да бъде толкова проста, колкото само една колона, или може да има колони, които всички други таблици имат общо, като по този начин реализира нещо като " наследяване" във вашата структура от данни.

Създайте основната таблица (приемайки, че няма общи колони между други таблици):

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

Ако решите да използвате вместо вмъкване, фактът, че стойността на идентичността идва от друга таблица, трябва да бъде прозрачен за клиента (вашата програма vb.net).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Сума на подзаявки на SQL Server

  2. Неуспешно влизане в машината за база данни на SQL Server 2008 за администраторски потребител в Windows 7

  3. запитване на двоична колона, като се използва като в sql сървър

  4. Как да премахнете водещите и крайните празни пространства в SQL Server – TRIM()

  5. Анализиране на I/O производителността за SQL Server