2012-05-06 1 views
0

У меня есть БД, где три из таблицы имеют отношения FK, поскольку:SQL Server Key Иностранные отношения с двумя таблицами

Таблица А имеет 2 (соответствующие) поля:
TypeId (INT)
LinkId (int)

В таблицах B и C имеется первичный ключ, который сопоставляется с LinkId в таблице A. Если TypeId в таблице A равен 1, то LinkId сопоставляется с первичным ключом в таблице B. Если это 2, то он отображает к первичному ключу в таблице C.

В этой плохо сконструированной БД есть в любом случае для обеспечения ссылочной целостности среди этих таблиц? т. е. можно ли запретить SQL Server вставлять запись в таблицу A, если соответствующая запись не существует в таблицах B или C?

+1

Я предполагаю, что это было бы возможно, прежде чем триггеры, но это не так просто, чтобы правильно строить их. Можно ли перепроектировать таблицы? –

+0

Таким образом, внешние ключи от TBL_A до B или C? ИЛИ от B, C до A? Не могли бы вы указать определение внешних ключей? –

ответ

1

Вы можете использовать две новые таблицы ссылок и падение LinkId из таблицы A

AB (Aid, Bid) 
AC (Aid, Cid) 

зависит от вашего приложения, хотя и вы контролируете вводные ...

Вы не должны используйте встроенные ограничения - вы можете писать собственные с триггерами, конечно, если хотите сохранить эту структуру.

что-то вроде:

CREATE TRIGGER trigger_name ON A 
     FOR INSERT, UPDATE 

     AS 

    declare @err varchar(50) 

    select @err = case 
     when inserted.typeid = 1 and not exists(select 0 from B where id=inserted.linkid) then 
      @err = 'No link record exists in B.' 
     when inserted.typeid = 2 and not exists(select 0 from C where id=inserted.linkid) then 
      @err = 'No link record exists in C.' 
     else @err = null  
     end 
     from inserted 

    if @err is not null RAISERROR (@err, 16, 1) 

 Смежные вопросы

  • Нет связанных вопросов^_^