Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
Добрый день.
Есть бизнес приложение MS SQL Server 2008 R2, доступа к коду приложения нет.
Необходимо сделать обработчик на событие обновления записи одной из таблиц.
пример триггера:

create trigger t1
on table1
after update
not for replication
as
begin
begin try
insert into table2 select col1,col2 from deleted
end try
begin catch
raiserror ('error',14,8) with log
end catch
end

проблема в том что некоторые функции бизнес приложения изменяющие таблицу table1 приводят к запуску триггера и записи данных в таблицу table2, а некоторые при попытке изменить таблицу table1 не приводят к запуску триггера, raseerror не запускается, запись в таблице table1 не изменяется. Само приложение генерирует не информативное сообщение, мол почему то не удалось.
Замечено что команды select в триггере не приводят к подобному поведению, не выполняются команды insert, delete.
Что может быть причиной, есть ли возможность каких-либо блокировок и т.п. для триггеров, которые могли бы приводить к такому поведению?
8 дек 12, 13:31    [13599666]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
beatseed
Есть бизнес приложение MS SQL Server 2008 R2

Поправка:
Есть бизнес приложение, использующее MS SQL Server 2008 R2
8 дек 12, 13:34    [13599677]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
beatseed,

Что вам нужно то?

Суда по названию темы, нужно "запретить запуск команд insert, delete из триггера"?
Тогда нужно просто убрать эти команды из текста триггера, правильно?
8 дек 12, 14:50    [13599872]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
Гость333
Member

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

У приложения достаточно прав на raiserror with log? Ибо
автор
Only a member of the sysadmin fixed server role or a user with ALTER TRACE permissions can specify WITH LOG.

Вставка в table2 может завершиться неудачно, например, по unique constraint violation. Исходной информации недостаточно, чтобы что-то точно сказать.
9 дек 12, 12:12    [13602142]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
alexeyvg
beatseed,

Что вам нужно то?

Суда по названию темы, нужно "запретить запуск команд insert, delete из триггера"?
Тогда нужно просто убрать эти команды из текста триггера, правильно?

Нет. У меня не запускается триггер after update с командами insert delete, нужно узнать почему. У бизнес приложения есть 2 команды изменяющие таблицу table1. Одна команда приводит к запуску триггера, другая не приводит к запуску триггера. Причем не запускается триггер только если есть команды на изменение( добавить, изменить, удалить) таблиц, если делать любую выборку данных, либо арифметические,логические операции триггер запускается как полагается, в обоих случаях.
9 дек 12, 16:58    [13602625]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
Гость333
Member

Откуда:
Сообщений: 3683
beatseed
У бизнес приложения есть 2 команды изменяющие таблицу table1. Одна команда приводит к запуску триггера, другая не приводит к запуску триггера.

Можете привести здесь эти "команды" в виде исходного текста T-SQL?
9 дек 12, 17:03    [13602637]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
beatseed
alexeyvg
beatseed,

Что вам нужно то?

Суда по названию темы, нужно "запретить запуск команд insert, delete из триггера"?
Тогда нужно просто убрать эти команды из текста триггера, правильно?

Нет. У меня не запускается триггер after update с командами insert delete, нужно узнать почему. У бизнес приложения есть 2 команды изменяющие таблицу table1. Одна команда приводит к запуску триггера, другая не приводит к запуску триггера. Причем не запускается триггер только если есть команды на изменение( добавить, изменить, удалить) таблиц, если делать любую выборку данных, либо арифметические,логические операции триггер запускается как полагается, в обоих случаях.


ну, это уже "какбы" перебор ;-)

покажите команды, которыми приложение апдейтит табле1
и команды выборки, которые возбуждают триггер
9 дек 12, 17:05    [13602648]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
Гость333,

Прав достаточно, код try catch raiserror вставил в пример чтоб показать, что триггер действительно не запускается, а не отрабатывает с ошибкой.

конкретно такой код триггера выполняется всегда :
begin
select * from deleted
end

а такой код триггера выполняется только в одной из 2-х команд бизнес приложения:
begin
insert into table2 select col1,col2 from deleted
end
и такой:
begin
delete from table2
end

table2 триггеров не имеет, тип полей в обоих таблицах совпадает.
constraints не причем, пример таблицы:
create table2 (col1 varchar (5) null, col2 varchar(5) null)
9 дек 12, 17:13    [13602672]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
Winnipuh,
этого сделать не могу. Команды изменяющие таблицу table1 вызываются из gui бизнес приложения, оно - черный ящик, т.е. кода у меня его нет и не будет, есть только база данных ,со всеми процедурами и т.п. t-sql код которых которые можно просматривать.
9 дек 12, 17:18    [13602680]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
beatseed
Winnipuh,
этого сделать не могу. Команды изменяющие таблицу table1 вызываются из gui бизнес приложения, оно - черный ящик, т.е. кода у меня его нет и не будет, есть только база данных ,со всеми процедурами и т.п. t-sql код которых которые можно просматривать.


ну так есть еще профайлер, который любой черный ящик делает прозрачным

а что по поводу срабатывания триггеров на командах выборки? срабатывают все-таки?
9 дек 12, 17:24    [13602698]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
Winnipuh,
да, команды выборки срабатывают.
По профайлеру - не в курсе его возможностей, как то ранее не было нужды его осваивать. Попробую выяснить.
9 дек 12, 17:31    [13602722]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
а что по поводу срабатывания триггеров на командах выборки? срабатывают все-таки?

ТС имел в виду, что если внутри триггера есть только команды select (и нет команд insert/update), то триггер срабатывает. И не имел в виду, что если приложение запускает команду select, то срабатывает триггер ;-)
9 дек 12, 17:36    [13602731]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
beatseed
Winnipuh,
да, команды выборки срабатывают.
По профайлеру - не в курсе его возможностей, как то ранее не было нужды его осваивать. Попробую выяснить.


да... я бы тоже сто лет его не видел, если бы не прижимало
9 дек 12, 17:46    [13602767]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Гость333
ТС имел в виду, что если внутри триггера есть только команды select (и нет команд insert/update), то триггер срабатывает. И не имел в виду, что если приложение запускает команду select, то срабатывает триггер ;-)
По его описанию трудно понять, что он имел в виду :-)

Вот что подрахумевается под:

beatseed
такой код триггера выполняется только в одной из 2-х команд бизнес приложения:
begin
insert into table2 select col1,col2 from deleted
end
и такой:
begin
delete from table2
end

Какие 2 команды посылает серверу бизнес-приложение???
9 дек 12, 18:32    [13602911]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
beatseed
У меня не запускается триггер after update с командами insert delete, нужно узнать почему.
Очевидно, у вас ошибка в триггере, которая забивается "крутыми" обработчиками ошибок try-catch и корявой обработчиком в корявом приложении.

Проще действительно посмотреть профайлером, ну и try-catch убрать - это само собой.
9 дек 12, 18:36    [13602932]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
а что по поводу срабатывания триггеров на командах выборки? срабатывают все-таки?

ТС имел в виду, что если внутри триггера есть только команды select (и нет команд insert/update), то триггер срабатывает. И не имел в виду, что если приложение запускает команду select, то срабатывает триггер ;-)


в обще-то да, но тут возникает вопрос:

откуда ТС знает, что селект в триггере отрабатывает?
Ведь он не выполняте руками апдейт, а утверждает, что только(!) загадочное приложение
умеет апдейтить таблицу...
9 дек 12, 18:37    [13602940]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Winnipuh
откуда ТС знает, что селект в триггере отрабатывает?
Ведь он не выполняте руками апдейт, а утверждает, что только(!) загадочное приложение
умеет апдейтить таблицу.
Да я говорю - вообще всё непонятно.

Конечно, нужно смотреть профайлером, ну и отлаживать триггер руками.

Если что-то непонятно, то опубликовать тут скрипты создания таблиц, текст триггера и текст тестового скрипта.
9 дек 12, 18:40    [13602953]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
Добрый день.
Таблицы:
create table1 (col1 varchar (5) null, col2 varchar(5) null)
create table2 (col1 varchar (5) null, col2 varchar(5) null)

ctreate trigger triger1
on table1
after update
not for replication
as
begin
insert into table2 select col1,col2 from deleted
end

других триггеров нет, constarints нет.

команда изменяющая table1 (вынута из профайлера)
exec sp_executesql N'update table1 set col2 = @col2 where col1 = @col1',N'@col1 varchar(5),@col2 varchar(5)',@col1=N'abc',@col2='def'

команда успешно выполняется в Query Analyzer приводя к успешному запуску тригера и записи данных в таблице table2.
При вызове из бизнес приложения - не удается, приложение генерирует ошибку, данные таблицы table1 не изменяются.

Если тригер сделать неактивным или изменить тригер на:
ctreate trigger triger1
on table1
after update
not for replication
as
begin
select * from deleted
end

,то вызов из бизнес приложения происходит, таблица table1 изменяется. Необходимо выяснить почему не удается запустить триггер позволяющий менять значение(вставлять, обновлять, удалять) другой таблицы.
Ведь приложение фактически отправляет запрос sql серверу, sql сервер уже ведь не зависит от окружения бизнес приложения, и независимо должен обработать запрос. На ум приходит только возможность установки транзации из бизнес приложения и отмена ее, но профайлер не обнаружил команд создания транзакций и ее отмены вокруг update запроса.

Перед запуском update в профайлере также обнаружено установка переменных окружения, могут ли они как то оказывать влияние?
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
11 дек 12, 05:02    [13610251]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
beatseed
команда успешно выполняется в Query Analyzer приводя к успешному запуску тригера и записи данных в таблице table2.
При вызове из бизнес приложения - не удается, приложение генерирует ошибку, данные таблицы table1 не изменяются.
Попробуйте первой строкой триггера указать
SET NOCOUNT ON
11 дек 12, 08:35    [13610408]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить запуск команд insert, delete из триггера  [new]
beatseed
Member

Откуда:
Сообщений: 20
alexeyvg,
огромное Вам спасибо, это решило проблему!
Никогда б не догадался.
11 дек 12, 09:42    [13610569]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить