powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Мой кривой триггер
14 сообщений из 14, страница 1 из 1
Мой кривой триггер
    #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
Мой кривой триггер
    #32064574
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверьте следующее:

Это единственный триггер на таблице?
На зависимых таблицах есть триггера?
...
Рейтинг: 0 / 0
Мой кривой триггер
    #32064576
Фотография TBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 2000м SQL каскадное удаление делается вообще без триггеров, если интересно...
...
Рейтинг: 0 / 0
Мой кривой триггер
    #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
Мой кривой триггер
    #32064588
newDave
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Мой кривой триггер
    #32064591
Фотография TBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно так и понимать, повторюсь: в 2000м SQL каскадное удаление делается вообще без триггеров . Именно такими строчками и делается, именно в 2000м SQL.
...
Рейтинг: 0 / 0
Мой кривой триггер
    #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
Мой кривой триггер
    #32064734
newDave
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа! А что, все таки на счет моего основного вопроса,
из таблицы-то ничего так и не удаляется.(см. первое сообщение в теме). Только не советуйте пожалуйста прямо щас менять сервак на 2000 :-)
...
Рейтинг: 0 / 0
Мой кривой триггер
    #32064742
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя происходит ошибка, скорее всего В ДРУГОМ триггере.

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

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

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

Код: plaintext
1.
Delete T from Telephones as T 
inner join deleted as D on D.CustId=T.CustId
...
Рейтинг: 0 / 0
Мой кривой триггер
    #32064745
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего у вас все-таки есть триггер(ы) на удаление для какой-то из таблиц Telephones, Addresses, Emails, Contacts, который и вызывает данную ошибку
...
Рейтинг: 0 / 0
Мой кривой триггер
    #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
Мой кривой триггер
    #32064885
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вчитавшись еще раз в выдаваемое сообщение, я догадался в чем дело <-- да Вы, батенька, нахал.

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


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