Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Мой кривой триггер / 14 сообщений из 14, страница 1 из 1
04.11.2002, 14:09:46
    #32064569
newDave
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Я решил реализовать каскадное удаление данных из других таблиц
при удалении строки из некой таблицы Customers. Для этого написал триггер:
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TRIGGER DelCustomer ON Customers
FOR DELETE 
AS
Delete from Telephones Where Telephones.CustId In (select CustId from deleted)
Delete from Addresses Where Addresses.CustId In (select CustId from deleted)
Delete from Emails Where Emails.CustId In (select CustId from deleted)
Delete from Contacts Where Contacts.CustId In (select CustId from deleted).

Теперь при удалении строки из Customers следующая ругань:
Код: plaintext
1.
2.
3.
[Microsoft][ODBC SQL Server Driver][SQL Server]Subquery returned more then  1  value.
This is not permitted when the subquery follows =, !=, <, <=, >, >= or when the
subquery is used as an expression.
[Microsoft][ODBC SQL Server Driver][SQL Server]The statment has been terminated.

Замечу, что раньше ругался только при удалени сразу большого числа строк
но теперь вообще не дает удалять. Пришлось пока убить этот триггер(без него все работает).

Скажите, что я неправильно сделал?
...
Рейтинг: 0 / 0
04.11.2002, 14:15:44
    #32064574
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Проверьте следующее:

Это единственный триггер на таблице?
На зависимых таблицах есть триггера?
...
Рейтинг: 0 / 0
04.11.2002, 14:19:53
    #32064576
TBB
TBB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
В 2000м SQL каскадное удаление делается вообще без триггеров, если интересно...
...
Рейтинг: 0 / 0
04.11.2002, 14:30:27
    #32064586
newDave
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
I) To VVG:
1. Триггер единственный.
2. На одной зависимой таблице есть подобный триггер на удаление из другой подтаблицы. Но по-моему результат был такой же когда у зависимых таблиц небыло триггеров.
II) Хмм... я в Books online вычитал, что SQL server не обеспечивает встроенных мех-ов каскадного удаления и обновления. Мол используйте для этого триггеры, а тут в вашем форуме встретились строки:
Код: plaintext
1.
2.
3.
4.
ALTER TABLE T2
       ADD FOREIGN KEY (T1ID)
                             REFERENCES T1
                             ON DELETE CASCADE
go

Как енто понимать? Может это потому-что у меня сервак 7.0, а не 2000?
III) Кстати можно как нибудь увидеть все триггеры, имеющиеся в БД.
...
Рейтинг: 0 / 0
04.11.2002, 14:35:04
    #32064588
newDave
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
...
Рейтинг: 0 / 0
04.11.2002, 14:39:36
    #32064591
TBB
TBB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Именно так и понимать, повторюсь: в 2000м SQL каскадное удаление делается вообще без триггеров . Именно такими строчками и делается, именно в 2000м SQL.
...
Рейтинг: 0 / 0
04.11.2002, 14:41:28
    #32064594
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
I) To VVG:
1. Триггер единственный.
...............
III) Кстати можно как нибудь увидеть все триггеры, имеющиеся в БД.




Код: plaintext
1.
2.
select so.name as [TriggerName],sp.name as [TableName] from sysobjects so
inner join sysobjects sp on so.parent_obj=sp.id
where so.xtype='TR'
...
Рейтинг: 0 / 0
04.11.2002, 20:39:03
    #32064734
newDave
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Господа! А что, все таки на счет моего основного вопроса,
из таблицы-то ничего так и не удаляется.(см. первое сообщение в теме). Только не советуйте пожалуйста прямо щас менять сервак на 2000 :-)
...
Рейтинг: 0 / 0
04.11.2002, 21:00:55
    #32064742
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
У тебя происходит ошибка, скорее всего В ДРУГОМ триггере.

Чтобы проверить, что и где как происходит, создай на время отладочную SP:

Create pocerdure TTT as
set nocount on
delete from Customers where (... условие, по которому ты пытаешься удалить запись)

Сохрани эту процедуру и запусти в отладчике. В отладчике всё время нажимай step into. Попадешь в отладку триггеров и увидишь то место, где происходит ошибка.
...
Рейтинг: 0 / 0
04.11.2002, 21:01:04
    #32064743
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Можно поменять все запросы примерно на такие:

Код: plaintext
1.
Delete T from Telephones as T 
inner join deleted as D on D.CustId=T.CustId
...
Рейтинг: 0 / 0
04.11.2002, 21:23:37
    #32064745
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Скорее всего у вас все-таки есть триггер(ы) на удаление для какой-то из таблиц Telephones, Addresses, Emails, Contacts, который и вызывает данную ошибку
...
Рейтинг: 0 / 0
05.11.2002, 11:17:36
    #32064875
newDave
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Эврика! Вчитавшись еще раз в выдаваемое сообщение, я догадался в чем дело. У меня действительно были триггеры в связанных такого типа:
Код: plaintext
1.
2.
3.
CREATE TRIGGER DelTel ON Telephones
FOR DELETE 
AS
Delete From ContactFIO Where ContactFIO.ContactFIOid = (select deleted.ContactFIOid from deleted)

Поменял =(select ...) на in(select ...) и похоже все заработало. Всем спасибо.
-----------------------------------
PS: Извиняюсь за совсем чайниковый вопрос, но как запустить процедуру в отладчике. А то я пробовал следовать совету Garya, что-то отладчика не нашел с ходу.
...
Рейтинг: 0 / 0
05.11.2002, 11:29:00
    #32064885
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Вчитавшись еще раз в выдаваемое сообщение, я догадался в чем дело <-- да Вы, батенька, нахал.

А если бы ты внимательно читал SQL.ru, то это озарение настигло бы тебя часов так 20 тому назад.
...
Рейтинг: 0 / 0
05.11.2002, 14:24:41
    #32064960
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мой кривой триггер
Встроенный отладчик имеется только в версии 2000. В 7ю0 его еще нет. Запускается он в QA. Щёлкни правой кнопокй мыши про процедуре в просмотрищке объектов и выбери Debug.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Мой кривой триггер / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]