Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
Вот такая вот ерунда. Вставил триггер типа INSERT - здесь все нормально. А вот триггер типа DELETE не может отработать. При попытке удалить строку из таблицы с PRIMARY KEY, CONSTRAIN для FOREIGN KEY запрещает операцию. Во втором триггере определил установку поля строки со значением внешнего ключа равным удаляемого первичного, в NULL, после этого удаление строки из зависимой таблицы. Строка из таблицы с PRIMARY KEY должно быть удалена в результате самой команды, после отработки триггера, я так понимаю. Логику со стороны клиента реализовать не могу, INSERT и DELETE выполняет программа, вот и приходится возится с серверными триггерами. Можно конечно отключить ограничения, но что-то не хочется... Помогите советом плиз.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 07:34 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
Сначала выполняются и проверяются все constraints, установленные для таблицы - foreign keys, check, defaults и т.д.и только потом управление передается триггеру. Удаление подчиненных записей перед удалением родительской записи через триггер на удаление невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 07:54 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
Вам поможет триггер типа CREATE TRIGGER Table1_TRG ON Table1 INSTEAD OF DELETE AS ... при этом все удаления надо будет делать внутри триггера в нужной последовательности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 07:54 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
Если речь идет о SQL2000, то может помочь INSTEAD OF триггер: create table a(pk int identity(1,1) not null,s nvarchar(10)) create table b(pk int identity(1,1) not null, apk int) go alter table a add constraint a_pk primary key clustered (pk) go alter table b add constraint b_apk foreign key (apk) references a(pk) go CREATE TRIGGER Tr_A_InsteadOfDelete ON a INSTEAD OF Delete AS BEGIN Delete b from b inner join deleted d on b.apk=d.pk Delete a from a inner join deleted d on a.pk=d.pk END GO insert into a(s) values('0001') insert into a(s) values('0002') insert into a(s) values('0003') insert into a(s) values('0004') insert into b(apk) values(1) insert into b(apk) values(1) insert into b(apk) values(1) insert into b(apk) values(3) insert into b(apk) values(3) insert into b(apk) values(3) GO Select * from a Select * from b delete a where pk=1 Select * from a Select * from b delete a where pk=2 Select * from a Select * from b delete a where pk=3 Select * from a Select * from b delete a where pk=4 Select * from a Select * from b GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 07:55 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
Наверно INSTEAD OF и помог бы но у меня SQL 7.0. А в "семерке" про это и не слыхивали. Я правда не совсем верно проблему осветил, строки в главной таблице обновляются подсистемой репликации. Зависимая таблица навешивается на главную как локальные данные. Решение должно быть, Е.Мамаев в своей книжке так и говорит, мол используйте триггеры для каскадирования. Только примера не дает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 08:26 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
ON DELETE CASCADE - тоже для SQL 2000. Есть еще такая вещь при определении Constraint: NOT FOR REPLICATION ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 08:40 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
NOT FOR REPLYCATION применяется для репликации сведением, насколько я знаю, а у нас REPLICATION SNAPSHOT. Да и проблема не в этом AFAIK, как триггер отработать если у ему ограничения мешают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 08:46 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 08:55 |
|
||
|
Не могу зажечь триггер на удаление
|
|||
|---|---|---|---|
|
#18+
Спасибо Александр, я пришел к такому же мнению. Более того вот что написано в BOL 7.0 ================================== Because CHECK constraints can reference only the columns on which the column- or table-level constraint has been defined, any cross-table constraints (in this case, business rules) must be defined as triggers. ================================== Не могу поверить что такая простая операция не была предусмотрена. :-0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2002, 09:07 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32022150&tid=1824069]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 395ms |

| 0 / 0 |
