Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> БД сообщает, будто удалено 2 строки, хотя удаляю 1, Мой триггер instead of del тому причина  
:(
    Опции темы
Hobotanius
  Дата 1.3.2009, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Сервер - MS SQLExpress 2005.
Через ADO на C# выполняю запрос(SqlCommand.ExecuteNonQuery()) на удаление строки из таблицы в БД.
Метод возвращает значение типа int - колличество строк подвергшихся операции.
Но после того как на эту таблицу ставлю свой триггер(instead of delete), то этот метод удаляя одну строку(по id) возвращает 
значение равное двум. Я подозреваю, что это от того, что я в триггере после всех проверок чтоб удалить строку 
пишу - delete from [dbo].[ИмяТаблицы] where id = @delete_id.
Наверное это не правильно? И надо как-то подругому?
И как сделать, чтоб траггер не удваивал возвращаемое значение?

PM MAIL   Вверх
Zioma
Дата 2.3.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 22.8.2007

Репутация: 5
Всего: 5



Каким образом ты определяешь количество удаленных строк?
PM MAIL   Вверх
Hobotanius
  Дата 3.3.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Цитата(Zioma @ 2.3.2009,  11:20)
Каким образом ты определяешь количество удаленных строк?

Кол-во удалённых строк должен возвращать метод SqlCommand.ExecuteNonQuery() (при условии, что  этот метод использует заранее заданный правильный sql-запрс на удаление).
Физически удаляется одна строка - я это знаю потому, что использую запрос типа 
"delete from [dbo].[Units] where id = 4" т.е. с указанием конкретного идентификатора строки.
И метод SqlCommand.ExecuteNonQuery() возвращает всё правильно, но только до тех пор пока я не включаю свой триггер instead of delete на таблицу из которой удаляю строку.
В триггере я делаю проверку - действительно ли можно удалить эту строку, и если можно, то в теле триггера пишу - delete from [dbo].[Units] where id = @del_id, где @del_id = deleted.id.
После включения триггера метод SqlCommand.ExecuteNonQuery() с заранее заданным sql-запросом типа "delete from [dbo].[Units] where id = 4" начинает возвращать значение 2.

PM MAIL   Вверх
Zioma
  Дата 3.3.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 22.8.2007

Репутация: 5
Всего: 5



Как бы то так понятнее объяснить ... smile

Короче, движок сервера по умолчанию всегда возвращает клиенту количество обработанных строк в виде
Код

(1 row(s) affected)


Такое ты очевидно видел, когда запускал запросы в утилитах QA или MSSMS.

Так вот, выполнение delete + триггер возвратит такое:
Код

(1 row(s) affected)

(1 row(s) affected)



То есть система изначально не знает, что есть триггер instead of delete и считает, что "delete from [dbo].[Units] where id = 4" отработала правильно и сигнализирует о 1 строке, которая обработана, хотя реально удаления не было. Плюс к этому в триггере идет реальное удаление и он (триггер) тоже возвращает, что обработано 1 строка. 1 + 1 = 2

И если ты перед выполнением удаления (не в триггере) установишь 
Код

set nocount on

то по всей видимости получишь количество обработанных строк = 0.

Поэтому, для правильного определения, сколько же строк реально было удалено, необходимо использовать глобальную переменную:
Код

select @@rowcount


PM MAIL   Вверх
Hobotanius
Дата 3.3.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Спасибо за ответ, вечером попробую и отпишусь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.