Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обойтись без триггеров для реализации каскадного удаления  [new]
palich12
Member

Откуда:
Сообщений: 359
Здравствуйте, коллеги!
Требуется реализовать простую БД на MS SQL, пример ниже.
Задача.
Есть некоторый набор вопросов, у каждого из которых есть набор вариантов ответа. Пользователь может ответить на вопрос путем выбора нескольких вариантов ответа. Таким образом в БД воздается запись о факте ответа и несколько записей связанных с ответом и вариантами ответа на вопрос, представляющие ответ пользователя.

Проблема в том что на всех связях должен быть каскад на удаление. Но он не работает для Вопроса т. к. каскадное удаление выполняется по двум ветвям и блокируется с целью сохранения целостности данных MS SQL. Я прочитал, что это условие можно отключить для репликации. А можно ли его отключить вообще? Оставить только каскадное удаление. Не хочется воротить кучу самописных триггеров на такой простой задачи. Да и Внешние ключи в отличии от Триггеров ORM понимает. Так что хотелось бы видеть их.

К сообщению приложен файл. Размер - 7Kb
25 мар 13, 15:52    [14092775]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без триггеров для реализации каскадного удаления  [new]
Гость333
Member

Откуда:
Сообщений: 3683
palich12,

Покажите DDL для вашей схемы. У меня вот не создалась таблица Selected:
use tempdb;
go
create table Question(Id int primary key);
create table Answer(Id int primary key, QuestionId int references Question(Id) on delete cascade);
create table "Option"(Id int primary key, QuestionId int references Question(Id) on delete cascade);

create table Selected
(   AnswerId int references Answer(Id) on delete cascade,
    OptionId int references "Option"(Id) on delete cascade,
    primary key(AnswerId, OptionId)
);
go

Таблицы Question, Answer и Option создаются, а создание Selected завершается с ошибкой
Msg 1785, Level 16, State 0, Line 5
Introducing FOREIGN KEY constraint 'FK__Selected__Option__5812160E' on table 'Selected' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Msg 1750, Level 16, State 0, Line 5
Could not create constraint. See previous errors.


Поэтому не ясно, какой там каскад для Вопроса не работает.
25 мар 13, 16:10    [14092870]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без триггеров для реализации каскадного удаления  [new]
palich12
Member

Откуда:
Сообщений: 359
Гость333, да все верно. Такую БД даже создать не удается пока во всех связях стоит ON DELETE CASCADE. Чтобы база создалась нужно как минимум в одной связи убрать каскад.
25 мар 13, 16:49    [14093178]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без триггеров для реализации каскадного удаления  [new]
Glory
Member

Откуда:
Сообщений: 104760
palich12
Я прочитал, что это условие можно отключить для репликации.

Если вы про NOT FOR REPLICATION, то это для всего FK constraint.
The foreign key constraint is not enforced when a replication agent performs an insert, update, or delete operation.


palich12
А можно ли его отключить вообще? Оставить только каскадное удаление.

Каскадные удаления существуют как часть FK constraint, а не сами по себе

palich12
Не хочется воротить кучу самописных триггеров на такой простой задачи.

Сделайте схему без циклов и не надо будет ничего воротить.

palich12
Так что хотелось бы видеть их.

FK constraint может существовать и без каскадных операций
25 мар 13, 16:49    [14093183]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без триггеров для реализации каскадного удаления  [new]
palich12
Member

Откуда:
Сообщений: 359
Glory, да действительно, отсутствие каскадов решает проблему ORM. Но триггеры видимо писать все равно придется. Что ж, хотя бы ORM глючить не будет
25 мар 13, 17:08    [14093336]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить