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

Откуда:
Сообщений: 25
Добрый день, форумчане! Есть триггер для каскадного удаления с курсором (да, я знаю что можно по другому, но такое задание).

CREATE TRIGGER CascadeDelSotr ON Sotrudniki
INSTEAD OF DELETE
AS DECLARE @otdel nvarchar(50), @sotrDel nvarchar(100), cur_del cursor
FOR SELECT * FROM deleted
OPEN cur_del
FETCH cur_del INTO @sotrDel, @otdel
WHILE (@@fetch_status = 0)
BEGIN
FETCH cur_del INTO @sotrDel, @otdel
DELETE FROM Dokumenti WHERE Dokumenti.Sotrudnik = @sotrDel
END
CLOSE cur_del
DEALLOCATE cur_del
DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel


Таблица сотрудников имеет ПК - Сотрудник
Таблица документов имеет ВК на этот ПК.
Только вот почему-то не работает триггер нормально. Как заметил - из таблицы документов удаляется только одна строка, из-за этого естесственно выбивается ошибка ограничения ПК.
Помогите решить проблему. Заранее большое спасибо!
2 янв 13, 16:18    [13716419]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
qwerty112
Guest
Dimcore
Добрый день, форумчане! Есть триггер для каскадного удаления с курсором (да, я знаю что можно по другому, но такое задание).

CREATE TRIGGER CascadeDelSotr ON Sotrudniki
INSTEAD OF DELETE
AS DECLARE @otdel nvarchar(50), @sotrDel nvarchar(100), cur_del cursor
FOR SELECT * FROM deleted
OPEN cur_del
  FETCH cur_del INTO @sotrDel, @otdel
  WHILE (@@fetch_status = 0)
  BEGIN
    FETCH cur_del INTO @sotrDel, @otdel
    DELETE FROM Dokumenti WHERE Dokumenti.Sotrudnik = @sotrDel
  END
CLOSE cur_del
DEALLOCATE cur_del
DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel



Таблица сотрудников имеет ПК - Сотрудник
Таблица документов имеет ВК на этот ПК.
Только вот почему-то не работает триггер нормально. Как заметил - из таблицы документов удаляется только одна строка, из-за этого естесственно выбивается ошибка ограничения ПК.
Помогите решить проблему. Заранее большое спасибо!

поменяй местами эти 2-е строки
2 янв 13, 16:21    [13716430]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
1.
FETCH cur_del INTO @sotrDel, @otdel
WHILE (@@fetch_status = 0)
BEGIN
    FETCH cur_del INTO @sotrDel, @otdel
    DELETE FROM Dokumenti WHERE Dokumenti.Sotrudnik = @sotrDel
END

Цикл неправильный - 2 FETCH-а подряд

2.
DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel

Что удалит эта команда
- если цикл по курсору уже _завершен_, а удалялось несколько записей из Sotrudnik ?

3. Цикл тут вообще не нужен. Используйте JOIN
2 янв 13, 16:30    [13716455]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

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

Спасибо большое! Я с этим во всех триггерах накосячил. Теперь всё ок :)
2 янв 13, 16:31    [13716461]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
1.
FETCH cur_del INTO @sotrDel, @otdel
WHILE (@@fetch_status = 0)
BEGIN
    FETCH cur_del INTO @sotrDel, @otdel
    DELETE FROM Dokumenti WHERE Dokumenti.Sotrudnik = @sotrDel
END

Цикл неправильный - 2 FETCH-а подряд

2.
DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel

Что удалит эта команда
- если цикл по курсору уже _завершен_, а удалялось несколько записей из Sotrudnik ?

3. Цикл тут вообще не нужен. Используйте JOIN


1. Да, уже исправил всё.
2. Удаляется нужная запись в списке сотрудников
3. Требуют реализацию каскадных удаления/апдейта триггерами с крсорами
2 янв 13, 16:33    [13716467]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dimcore
2. Удаляется нужная запись в списке сотрудников

И каким образом удалится _несколько_ записей то ?

Dimcore
3. Требуют реализацию каскадных удаления/апдейта триггерами с крсорами

Типа чтобы медленнее работало ?
2 янв 13, 16:35    [13716471]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
2. Удаляется нужная запись в списке сотрудников

И каким образом удалится _несколько_ записей то ?

Dimcore
3. Требуют реализацию каскадных удаления/апдейта триггерами с крсорами

Типа чтобы медленнее работало ?


1. Несколько записей курсором будут удаляться из таблицы документов, а в таблице сотрудников только одна.
2. Для практики работы с триггерами и курсорами. Курсач однако
2 янв 13, 16:47    [13716499]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dimcore
1. Несколько записей курсором будут удаляться из таблицы документов, а в таблице сотрудников только одна.

Да что вы говорите.
И как вы запретите команду DELETE FROM Sotrudniki, например ?
2 янв 13, 16:51    [13716510]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Возникла ещё одна проблема. Уже с апдейтом

CREATE TRIGGER CascadeUpdateSotr ON Sotrudniki
INSTEAD OF UPDATE
AS
DECLARE @otdel nvarchar(50), @sotrDel nvarchar(100), @sotrIns nvarchar(100),
cur_del cursor FOR SELECT * FROM deleted

SELECT @sotrIns = Sotrudniki FROM INSERTED
OPEN cur_del
FETCH cur_del INTO @sotrDel, @otdel
WHILE (@@fetch_status = 0)
BEGIN
UPDATE Dokumenti SET Sotrudniki = @sotrIns WHERE Sotrudniki = @sotrDel
FETCH cur_del INTO @sotrDel, @otdel
END
CLOSE cur_del
DEALLOCATE cur_del
UPDATE Sotrudniki SET Sotrudniki = @sotrIns WHERE Sotrudniki.Sotrudnik = @sotrDel
2 янв 13, 16:54    [13716520]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
1. Несколько записей курсором будут удаляться из таблицы документов, а в таблице сотрудников только одна.

Да что вы говорите.
И как вы запретите команду DELETE FROM Sotrudniki, например ?


В смысле, запрещу? А зачем мне запрещать там удаление?
2 янв 13, 16:55    [13716523]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
qwerty112
Guest
Dimcore
Glory
пропущено...

Да что вы говорите.
И как вы запретите команду DELETE FROM Sotrudniki, например ?


В смысле, запрещу? А зачем мне запрещать там удаление?

что ты не поймёш никак ?
если из таблицы Sotrudniki будет удалятся больше чем одна запись - delete fot Sotrudniki,
то твой триггер удалит только одну из них - DELETE FROM Dokumenti WHERE Dokumenti.Sotrudnik = @sotrDel
2 янв 13, 17:04    [13716544]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
qwerty112
Guest
fix
qwerty112
если из таблицы Sotrudniki будет удалятся больше чем одна запись - delete from Sotrudniki,
то твой триггер удалит только одну из них - DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel
2 янв 13, 17:05    [13716550]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dimcore
В смысле, запрещу? А зачем мне запрещать там удаление?

Ну так команда DELETE FROM Sotrudnik удаляет больше одной записи.

Dimcore
Возникла ещё одна проблема. Уже с апдейтом

Надо угадать проблему ?
2 янв 13, 17:06    [13716552]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
В смысле, запрещу? А зачем мне запрещать там удаление?

Ну так команда DELETE FROM Sotrudnik удаляет больше одной записи.

Dimcore
Возникла ещё одна проблема. Уже с апдейтом

Надо угадать проблему ?


1. Там строки уникальные.
2. Извиняюсь. Пишет ошибку ВК
2 янв 13, 17:14    [13716566]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dimcore
1. Там строки уникальные.

Вы задаваемый вам вопрос понимаете ?
DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel удаляет одну запись. Всегда.
Даже при команде DELETE FROM Sotrudniki. Которая удаляет много записей.

Dimcore
2. Извиняюсь. Пишет ошибку ВК

Т.е. угадать текст ошибки и команду, которая ее вызывает ?
2 янв 13, 17:19    [13716579]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
1. Там строки уникальные.

Вы задаваемый вам вопрос понимаете ?
DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel удаляет одну запись. Всегда.
Даже при команде DELETE FROM Sotrudniki. Которая удаляет много записей.

Dimcore
2. Извиняюсь. Пишет ошибку ВК

Т.е. угадать текст ошибки и команду, которая ее вызывает ?


1. Мне и надо чтобы оно удаляло 1 запись там.
2.
Конфликт инструкции UPDATE с ограничением FOREIGN KEY "FK_Dokumenti_Sotrudniki". Конфликт произошёл в базе данных "Dimcore", таблица "dbo.Sotrudniki", column 'Sotrudnik'.
2 янв 13, 17:28    [13716589]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dimcore
1. Мне и надо чтобы оно удаляло 1 запись там.

Даже если надо удалить все, то будет удаляться 1 ???
Крутой функционал.

Dimcore
2.
Конфликт инструкции UPDATE с ограничением FOREIGN KEY "FK_Dokumenti_Sotrudniki". Конфликт произошёл в базе данных "Dimcore", таблица "dbo.Sotrudniki", column 'Sotrudnik'.

Ну так проверяйте, чем вы апдейтите поля
2 янв 13, 17:36    [13716603]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
1. Мне и надо чтобы оно удаляло 1 запись там.

Даже если надо удалить все, то будет удаляться 1 ???
Крутой функционал.

Dimcore
2.
Конфликт инструкции UPDATE с ограничением FOREIGN KEY "FK_Dokumenti_Sotrudniki". Конфликт произошёл в базе данных "Dimcore", таблица "dbo.Sotrudniki", column 'Sotrudnik'.

Ну так проверяйте, чем вы апдейтите поля


1. Запутался сначала. Щас понял о чём Вы. Исправил, сейчас удаляет все что надо.
2. Так руками просто меняю имя сотрудника, а оно пишет ошибку
2 янв 13, 17:47    [13716627]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dimcore
2. Так руками просто меняю имя сотрудника, а оно пишет ошибку

"Не просто меняю", а написанный вами код меняет.
2 янв 13, 17:53    [13716644]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
2. Так руками просто меняю имя сотрудника, а оно пишет ошибку

"Не просто меняю", а написанный вами код меняет.


CREATE TRIGGER CascadeDelSotr ON Sotrudniki
INSTEAD OF DELETE
AS DECLARE @otdel nvarchar(50), @sotrDel nvarchar(100), cur_del cursor
FOR SELECT * FROM deleted
OPEN cur_del
FETCH cur_del INTO @sotrDel, @otdel
WHILE (@@fetch_status = 0)
BEGIN
DELETE FROM Dokumenti WHERE Dokumenti.Sotrudnik = @sotrDel
DELETE FROM Sotrudniki WHERE Sotrudniki.Sotrudnik = @sotrDel
FETCH cur_del INTO @sotrDel, @otdel
END
CLOSE cur_del
DEALLOCATE cur_del



Вот с апдейтом ситтуация печально(
2 янв 13, 18:04    [13716672]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

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

Не то послал.

Какой код? Я ч-з MS SQL Server просто переписываю строку и всё
2 янв 13, 18:05    [13716673]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
2. Так руками просто меняю имя сотрудника, а оно пишет ошибку

"Не просто меняю", а написанный вами код меняет.


Я просто переписываю строку в редакторе и всё
2 янв 13, 18:06    [13716675]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dimcore
Я ч-з MS SQL Server просто переписываю строку и всё

Ага. А триггер святой дух создал

Dimcore
Вот с апдейтом ситтуация печально(

Разумеется.
Потому, что в Dokumenti нельзя обновить поле Sotrudniki, т.к. нового значения еще нет в таблице Sotrudniki
2 янв 13, 18:09    [13716687]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Glory
Dimcore
Я ч-з MS SQL Server просто переписываю строку и всё

Ага. А триггер святой дух создал

Dimcore
Вот с апдейтом ситтуация печально(

Разумеется.
Потому, что в Dokumenti нельзя обновить поле Sotrudniki, т.к. нового значения еще нет в таблице Sotrudniki


1. Так я же код триггера писал уже выше
2. Ок, сейчас попробую
2 янв 13, 18:10    [13716690]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с касадными триггерами  [new]
Dimcore
Member

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

Апдейт заработал! Спасибо большое)
2 янв 13, 18:12    [13716692]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить