[MSSQL] Разрешить только каскадное удаление из Detail-таблицы
От: stomsky Россия  
Дата: 31.05.13 17:52
Оценка:
Привет всем!
MS Sql Server (версия, думаю, безразлична).
Имею две связанные таблицы (модельный пример):
create table MasterTable
(
    MasterTableId    int identity(1, 1)    primary key,
  ...
)
create table DetailTable
(
    DetailTable    int identity(1, 1)    primary key,
    MasterTableId    int not null        foreign key (MasterTableId)
            references MasterTable(MasterTableId)
            on update no action
            on delete cascade,
 ...
)


Необходимо сделать так, чтобы строки из DetailTable могли удаляться только в результате каскадного удаления, инициированного удалением соответствующей master-строки из MasterTable. А удалять строки напрямую из DetailTable нужно запретить.
Я ничего лучше триггера для решения проблемы не нашел:
create trigger DetailTable_Trigger_Delete
   on  DetailTable AFTER DELETE
as
begin
    if exists(select * 
              from MasterTable (rowlock), 
              deleted 
              where MasterTable.MasterTableId = deleted.MasterTableId)
    begin
        raiserror('Deleting error', 16, 1)
        rollback
    end
end


Вроде бы все работает как надо, но...
Собственно вопрос: насколько надежно этот триггер будет работать при конкурентном доступе к одним и тем же строкам нескольких пользователей, выполняющих разные действия с разными уровнями изоляции транзакций. Можно ли быть на 100% уверенным, что строку из DetailTable напрямую удалить не удастся без отключения триггера?
Красота — наивысшая степень целесообразности. (c) И. Ефремов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.