Как определить ссылочную целостность в этом сценарии для 2 таблиц SQL Server?

У меня есть 2 таблицы в SQL Server 2005 следующим образом

Таблица А

  • ActionID (PK, int, не нуль)
  • ProgressID (уникальный идентификатор, не нуль)
  • ReferID (уникальный идентификатор, не нуль)
  • Поле XYZ (varchar(50), не нуль)
  • Поле MNO (tinyint, не null)

Таблица Б

  • TrackID (PK, целое число, не нуль)
  • ProgressID (уникальный идентификатор, не нуль)
  • ReferID (уникальный идентификатор, не нуль)
  • Поле ABC (varchar(20), не нуль)
  • Поле EFG (дата-время, не нуль)

Теперь у меня конкретный вопрос:

ProgressID в обеих таблицах относятся к одному и тому же объекту. И я хочу установить интегральную связь, чтобы удаление ProgressID в таблице A было невозможно, когда значение существует в таблице B. Как это сделать?


person Jarvis Bot    schedule 01.02.2011    source источник


Ответы (1)


Я бы порекомендовал триггер перед удалением для этого. Что-то вроде

create trigger tr_tableA_progressId
on TableA for Delete
as 
    if exists
        (select 'true'
        from dbo.TableB
        where TableB.progressID = (select progressID
                                  from deleted d))

        BEGIN
            RAISERROR 'Cannot delete progressId exists in TableB'
            ROLLBACK TRAN
        End

Я не знаю ограничения, которое будет обеспечивать то, что вы хотели бы.

person Haeflinger    schedule 01.02.2011