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

Откуда: Мурманск
Сообщений: 27465
Думаю мой вопрос окажется простым для профи, но у меня проблемы с созданием тригера, в книжке по которой я изучаю сей предмет, написан только 1 пример и синтаксис команды, так что набить руку пока не получается :(
Имеем вот такой вот текст:
SET NOCOUNT ON
IF not exists(select ID from sysobjects where name = 'IN_Podrazdelenie_1S')
	BEGIN
		CREATE TRIGGER IN_Podrazdelenie_1S ON _1SUPDTS
		AFTER INSERT
		AS

		SET NOCOUNT ON

		IF exists(SELECT OBJID FROM INSERTED WHERE TYPEID = 7123 AND DELETED != 'D') 
			BEGIN
			DECLARE @CODE_Pdr as decimal(2) 

			SET @CODE_Pdr = (SELECT TOP 1 CAST(CODE as decimal(2)) FROM SC5933 (NOLOCK) WHERE SP6958 in (SELECT SP7130 FROM INSERTED INNER JOIN DH7123  ON IDDOC = OBJID))
			DELETE FROM _1SUPDTS WHERE TYPEID = 7123 AND OBJID in (SELECT OBJID FROM INSERTED) AND DBSIGN != isnull(@CODE_Pdr,0)  AND DELETED != 'D'
			END
	END
При синтаксическом контроле ошибка выдается на слове TRIGGER...
Подскажите плиз как правильно писать тригеры...
Так же если не затруднит оцените код тригера - можно ли его сделать более простым? или и так нормально?
16 июн 05, 10:16    [1623876]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
BOL, CREATE TRIGGER:
...
CREATE TRIGGER must be the first statement in the batch and can apply to only one table.
...
16 июн 05, 10:23    [1623916]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
if <условие проверки существования триггера> drop trigger mytrigger
go
create trigger mytrigger ...
16 июн 05, 10:28    [1623933]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
IF not exists(select ID from sysobjects where name = 'IN_Podrazdelenie_1S')
drop trigger ...
go
create trigger ...
begin 
    set nocount on
end
16 июн 05, 10:29    [1623936]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Glory
if <условие проверки существования триггера> drop trigger mytrigger
go
create trigger mytrigger ...


Спасибо, большое, но а можно как-нибудь сделать без drop trigger ???

например типа
if <условие существования ригера> RETURN
GO
CREATE TRIGGER My_Trigger?
16 июн 05, 10:33    [1623961]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Сергей84
Glory
if <условие проверки существования триггера> drop trigger mytrigger
go
create trigger mytrigger ...


Спасибо, большое, но а можно как-нибудь сделать без drop trigger ???

например типа
if <условие существования ригера> RETURN
GO
CREATE TRIGGER My_Trigger?

alter trigger
16 июн 05, 10:35    [1623972]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Гавриленко Сергей Алексеевич
Сергей84
Glory
if <условие проверки существования триггера> drop trigger mytrigger
go
create trigger mytrigger ...


Спасибо, большое, но а можно как-нибудь сделать без drop trigger ???

например типа
if <условие существования ригера> RETURN
GO
CREATE TRIGGER My_Trigger?

alter trigger

А если тригер не существует? ;)
16 июн 05, 10:38    [1623990]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Сергей84
А если тригер не существует? ;)

Тогда drop/create. Чем не нравится-то?
16 июн 05, 10:39    [1623998]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Сразу на ум пришел еще один вопрос, как сравнить текст тригера с текстом который должен быть???
и как быть в случае, если текст тригера хранится в зашифрованом виде?
16 июн 05, 10:40    [1624003]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Сергей84
Сразу на ум пришел еще один вопрос, как сравнить текст тригера с текстом который должен быть???

См про sp_helptext.
Сергей84

и как быть в случае, если текст тригера хранится в зашифрованом виде?

Сначала расшифровать.
16 июн 05, 10:41    [1624012]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
Сразу на ум пришел еще один вопрос, как сравнить текст тригера с текстом который должен быть???
Зачем ? Если у вас в скрипте правильныя версия триггера, то зачем ее с чем-то сравнивать ?
16 июн 05, 10:43    [1624016]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Гавриленко Сергей Алексеевич
Сергей84
А если тригер не существует? ;)

Тогда drop/create. Чем не нравится-то?

Не нравится тем, что я собираюсь вызывать процедуру проверки при открытии определенного документа пользователем, т.к. тригер нацелен на обработку этого документа, но проблема в том, что в момент drop\create попутно может изменятся дргуой документ этого же типа другим пользователем, а в этот момент происходит пересоздание тригера - и существует вероятность коллизии, что тригер пропустит этот документ, а из-за этого будет глюк, который я и не сразу увижу, а пользователем долампочки....
16 июн 05, 10:44    [1624018]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
Сергей84
Гавриленко Сергей Алексеевич
Сергей84
А если тригер не существует? ;)

Тогда drop/create. Чем не нравится-то?

Не нравится тем, что я собираюсь вызывать процедуру проверки при открытии определенного документа пользователем, т.к. тригер нацелен на обработку этого документа, но проблема в том, что в момент drop\create попутно может изменятся дргуой документ этого же типа другим пользователем, а в этот момент происходит пересоздание тригера - и существует вероятность коллизии, что тригер пропустит этот документ, а из-за этого будет глюк, который я и не сразу увижу, а пользователем долампочки....

Есть такое понятие - транзакция
16 июн 05, 10:45    [1624023]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Сергей84
Гавриленко Сергей Алексеевич
Сергей84
А если тригер не существует? ;)

Тогда drop/create. Чем не нравится-то?

Не нравится тем, что я собираюсь вызывать процедуру проверки при открытии определенного документа пользователем, т.к. тригер нацелен на обработку этого документа, но проблема в том, что в момент drop\create попутно может изменятся дргуой документ этого же типа другим пользователем, а в этот момент происходит пересоздание тригера - и существует вероятность коллизии, что тригер пропустит этот документ, а из-за этого будет глюк, который я и не сразу увижу, а пользователем долампочки....
Не волнуйтесь, такой коллизии не произойдет.
16 июн 05, 10:45    [1624024]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Glory
Сразу на ум пришел еще один вопрос, как сравнить текст тригера с текстом который должен быть???
Зачем ? Если у вас в скрипте правильныя версия триггера, то зачем ее с чем-то сравнивать ?

Затем, что этот тригер будет присматривать за миграцией разработанной умниками из 1С, а как поведет себя 1С при реструкторизации\верификации - загадка... поэтому и боюсь я оставлять так тригер без присмотра, а без него за день может выпасть до 100 документов, которые я буду оч. долго в ручном режиме разгребать...
16 июн 05, 10:47    [1624036]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Сергей84
Glory
Сразу на ум пришел еще один вопрос, как сравнить текст тригера с текстом который должен быть???
Зачем ? Если у вас в скрипте правильныя версия триггера, то зачем ее с чем-то сравнивать ?

Затем, что этот тригер будет присматривать за миграцией разработанной умниками из 1С, а как поведет себя 1С при реструкторизации\верификации - загадка... поэтому и боюсь я оставлять так тригер без присмотра, а без него за день может выпасть до 100 документов, которые я буду оч. долго в ручном режиме разгребать...

А триггер зачем? Джобы никто не отменял.
16 июн 05, 10:48    [1624043]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
2 Glory
Ну я как бы вкурсе того, что такое транзакция, только какое она имеет отношение к созданию тригера, который следат за документом, но документу пофиг есть ли тригер...
не совсем улавливаю, что вы хотите этим сказать...
2 tpg
Почему вы в этом так уверены? Я то и могу поверить вам на слово, но моя начальство мне наслово не поверит, скажет - обоснуй.
16 июн 05, 10:50    [1624052]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Гавриленко Сергей Алексеевич
Сергей84
Glory
Сразу на ум пришел еще один вопрос, как сравнить текст тригера с текстом который должен быть???
Зачем ? Если у вас в скрипте правильныя версия триггера, то зачем ее с чем-то сравнивать ?

Затем, что этот тригер будет присматривать за миграцией разработанной умниками из 1С, а как поведет себя 1С при реструкторизации\верификации - загадка... поэтому и боюсь я оставлять так тригер без присмотра, а без него за день может выпасть до 100 документов, которые я буду оч. долго в ручном режиме разгребать...

А триггер зачем? Джобы никто не отменял.

Джоб не оптимально, зачем мне джоб который скажем с интервалом в 1 час будет мучать сервак, если скажем в этот день ни тригер, ни эти документы не менялись и не использовались, а в другой день будет оч. интенсивный обмен скажем раз в 30 мин, тогда джоб может не успеть....
16 июн 05, 10:53    [1624059]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
Джоб не оптимально, зачем мне джоб который скажем с интервалом в 1 час будет мучать сервак, если скажем в этот день ни тригер, ни эти документы не менялись и не использовались, а в другой день будет оч. интенсивный обмен скажем раз в 30 мин, тогда джоб может не успеть....

Т.е. триггер, по Вашему, сервак мучать не будет?
16 июн 05, 10:55    [1624068]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
2 Glory
Ну я как бы вкурсе того, что такое транзакция, только какое она имеет отношение к созданию тригера, который следат за документом, но документу пофиг есть ли тригер...
не совсем улавливаю, что вы хотите этим сказать...

Если делать drop/create trigger в транзакции, то это будет единым действием. И никто внутри этого действия из другого коннекта не сможет "попутно изменить другой документ и триггер его пропустит"
16 июн 05, 10:58    [1624089]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Гавриленко Сергей Алексеевич
автор
Джоб не оптимально, зачем мне джоб который скажем с интервалом в 1 час будет мучать сервак, если скажем в этот день ни тригер, ни эти документы не менялись и не использовались, а в другой день будет оч. интенсивный обмен скажем раз в 30 мин, тогда джоб может не успеть....

Т.е. триггер, по Вашему, сервак мучать не будет?

Почему не будет? - будет конечно, но джоб работает по расписанию, что не приемлимо, у меня 120 пользователей, я же не знаю с каким интервалом им может приспичить обменяться данными, поработать с этими документами, скока времени это все займет и т.п. т.е. мне остается сидеть тригером и мониторить те данные, которые гонят в таблицу отвечающую за миграцию и подчищать ненужные данные, если вовремя это не сделать - то потом только вручную все это искать и править...
16 июн 05, 10:58    [1624095]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Сергей84
2 tpg
Почему вы в этом так уверены? Я то и могу поверить вам на слово, но моя начальство мне наслово не поверит, скажет - обоснуй.
Ну, потому хотя бы, что в триггер попадают все обрабатываемые строки и триггер всегда выполняется в транзакции.
16 июн 05, 10:59    [1624102]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
GBEE
Member

Откуда: Санкт-Петербург, ВО
Сообщений: 56
Что - то до меня совсем не доходит, зачем триггер все время пересоздавать?
16 июн 05, 12:39    [1624600]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Как советовало большинство решил сделать через пересоздание, но вот проблема, грит синтаксическая ошибка и выдает строчку GO, отсылаю через ADO, поэтому код должен быть понятен всем ;)
	objConnection	= CreateObject("ADODB.Connection");
	objConnection.ConnectionTimeOut	= 60;
	objConnection.CommandTimeOut	= 60;
	objConnection.CursorLocation	= 3 ;
	objConnection.Open(ConnectionString);
	Query			= CreateObject("ADODB.Recordset");
	Query.ActiveConnection=objConnection;  
	TextSQL = "
	|SET NOCOUNT ON
	|IF exists(select ID from sysobjects where name = 'IN_Podrazdelenie_1S') BEGIN DROP TRIGGER IN_Podrazdelenie_1S END 
	|GO
	|CREATE TRIGGER IN_Podrazdelenie_1S ON _1SUPDTS
	|AFTER INSERT
	|AS
	|
	|SET NOCOUNT ON
    |
	|IF exists(SELECT OBJID FROM INSERTED WHERE TYPEID = 7123 AND DELETED != 'D') 
	|	BEGIN
	|	DECLARE @CODE_Pdr as decimal(2) 
    |
	|	SET @CODE_Pdr = (SELECT TOP 1 CAST(CODE as decimal(2)) FROM SC5933 (NOLOCK) WHERE SP6958 in (SELECT SP7130 FROM INSERTED INNER JOIN DH7123  ON IDDOC = OBJID))
	|	DELETE FROM _1SUPDTS WHERE TYPEID = 7123 AND OBJID in (SELECT OBJID FROM INSERTED) AND DBSIGN != isnull(@CODE_Pdr,0)  AND DELETED != 'D'
	|	END
	|
	|GO
	|
	|IF exists(select ID from sysobjects where name = 'UP_Podrazdelenie_1S') BEGIN DROP TRIGGER UP_Podrazdelenie_1S END
	|GO
	|CREATE TRIGGER UP_Podrazdelenie_1S ON _1SUPDTS
	|AFTER UPDATE
	|AS
	|
	|SET NOCOUNT ON
    |
	|IF exists(SELECT OBJID FROM INSERTED WHERE TYPEID = 7123 AND DELETED != 'D') 
	|	BEGIN
	|	DECLARE @CODE_Pdr as decimal(2) 
    |
	|	SET @CODE_Pdr = (SELECT TOP 1 CAST(CODE as decimal(2)) FROM SC5933 (NOLOCK) WHERE SP6958 in (SELECT SP7130 FROM INSERTED INNER JOIN DH7123  ON IDDOC = OBJID))
	|	DELETE FROM _1SUPDTS WHERE TYPEID = 7123 AND OBJID in (SELECT OBJID FROM INSERTED) AND DBSIGN != isnull(@CODE_Pdr,0)  AND DELETED != 'D'
	|	END 
	|";
	Query.Open(TextSQL);  
	objConnection.Close();
Смотрю в Profler - идет запрос вроде как надо, копирую его и Profiler-а, запускаю в QA - работает, может когда отправляешь такие запросы через ADO есть какая-нибудь хитрость???
16 июн 05, 13:21    [1624856]     Ответить | Цитировать Сообщить модератору
 Re: Не получается создать тригер, подскажите, что я делаю не так :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
GO -это разделитель batch-ей, который принят в утилитах MS.
Это не есть команда TSQL
16 июн 05, 13:30    [1624923]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить