Привет всем!
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) И. Ефремов