В сценарии с несколькими арендаторами предположим, что у вас есть 2 таблицы: подписчик и контакт.
Вы хотите сразу узнать, кто является основным контактом для подписчика. Однако таблица контактов также должна иметь ссылку FKEY на SubscriberId для разделения / для использования в качестве ключа федерации и т. Д. (SQL Azure).
=======================================================================
Subscriber.sql
=======================================================================
-- One who has subscribed to Rhipheus
CREATE TABLE [rhipheus].[Subscriber]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Subscriber_Id] PRIMARY KEY CLUSTERED,
[ShortName] NVARCHAR(50) NOT NULL,
[LegalName] NVARCHAR(255) NOT NULL,
[SmallLogoPath] NVARCHAR(MAX) NOT NULL,
[LargeLogoPath] NVARCHAR(MAX) NOT NULL,
[PrimaryContactId] UNIQUEIDENTIFIER NULL REFERENCES [rhipheus].[Contact]([Id]),
)
====================================================================
Contact.sql
====================================================================
CREATE TABLE [rhipheus].[Contact]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Contact_Id] PRIMARY KEY CLUSTERED,
[SubscriberId] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [FKEY_Contact_SubscriberId_Subscriber_Id] REFERENCES [rhipheus].[Subscriber]([Id]),
[FirstName] NVARCHAR(50) NOT NULL,
[LastName] NVARCHAR(50) NOT NULL,
)
Используется для работы с проектом базы данных 2010, потому что он удаляет все ограничения на уровне столбцов и создает их с использованием отдельных сценариев ALTER.
Я решил эту проблему в VS.Net 2012, объявив столбец внешнего ключа как NULLable и добавив внешние ключи на подписчике, используя отдельный оператор ALTER. Конечно, проект SQL Server в VS 2012 не позволил бы мне сделать это объявление на уровне столбца, так как он не может определить, какую таблицу создать в первую очередь (даже если HINT находится прямо в форме объявления NULLable) .
=======================================================================
Subscriber.sql
=======================================================================
-- One who has subscribed to Rhipheus
CREATE TABLE [rhipheus].[Subscriber]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Subscriber_Id] PRIMARY KEY CLUSTERED,
[ShortName] NVARCHAR(50) NOT NULL,
[LegalName] NVARCHAR(255) NOT NULL,
[SmallLogoPath] NVARCHAR(MAX) NOT NULL,
[LargeLogoPath] NVARCHAR(MAX) NOT NULL,
[PrimaryContactId] UNIQUEIDENTIFIER NULL
)
====================================================================
Contact.sql
====================================================================
CREATE TABLE [rhipheus].[Contact]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Contact_Id] PRIMARY KEY CLUSTERED,
[SubscriberId] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [FKEY_Contact_SubscriberId_Subscriber_Id] REFERENCES [rhipheus].[Subscriber]([Id]),
[FirstName] NVARCHAR(50) NOT NULL,
[LastName] NVARCHAR(50) NOT NULL
)
====================================================================
Subscriber.ForeignKeys.sql
====================================================================
ALTER TABLE [rhipheus].[Subscriber] ADD CONSTRAINT [FKEY_Subscriber_PrimaryContactId_Contact_Id] FOREIGN KEY([PrimaryContactId]) REFERENCES [rhipheus].[Contact]([Id])
GO