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

Откуда:
Сообщений: 48
Здравствуйте. Возникла проблема по работе триггера. При добавлении данных в форму и занесении их в БД, триггер должен проверять данные на соответствие определенным условиям и вносить изменения во вторую таблицу БД. Использую обработку события на insert. Тут вроде все ясно. НО: В форме ввода данных при добавлении новой информации она сохраняется дважды - сначала по кнопке "Сохранить", а потом "Подтвердить". И получается, что уже при нажатии на кнопку "Сохранить" начинает работать триггер, и когда я пытаюсь подтвердить внесенную информацию, программа выдает ошибку (см.скрин). Как в данном случае можно поступить?


Сам триггер:

К сообщению приложен файл. Размер - 24Kb
9 июн 15, 10:26    [17748079]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
qsc
Member

Откуда:
Сообщений: 48
сам триггер:

-- отслеживаем изменение данных в MSO420 и при соблюдении условий добавляем запись в MSF096_STD_VOLAT

CREATE TRIGGER Comments
  on MSF420 
  after INSERT
AS
begin 
DECLARE @comp_code char(4)
       ,@dt_code char(4)
       ,@key char(24)
select
      @comp_code = COMP_CODE, 
      @dt_code = DOWN_TIME_CODE, 
      @key=MSF420.SHIFT+' '+MSF420.DOWN_TIME_CODE+'01' -- составной ключ
from MSF420
if (@comp_code='МАРК' and @dt_code='ПП') 
begin
 insert into MSF096_STD_VOLAT values ('DT',@key,'0000','60','blablabla','','','','')

end
END
GO

GO
9 июн 15, 10:28    [17748092]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
qsc
Как в данном случае можно поступить?

Правильно программу написать

Триггер срабатывает не рано и не поздно. Триггер срабатывает тогда, когда происходит событие, для которого этот триггер написан. И срабатывает столько раз, сколько раз это событие происходит
9 июн 15, 10:29    [17748105]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
qsc,

вообще-то, этот вопрос не по серверу...
Но в таблице можно предусмотреть признак "подтверждён".
На кнопку "Сохранить" - INSERT
На кнопку "Подтвердить" - UPDATE поля "подтверждён".
9 июн 15, 10:31    [17748122]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
qsc
сам триггер:

-- отслеживаем изменение данных в MSO420 и при соблюдении условий добавляем запись в MSF096_STD_VOLAT

CREATE TRIGGER Comments
  on MSF420 
  after INSERT
AS
begin 
DECLARE @comp_code char(4)
       ,@dt_code char(4)
       ,@key char(24)
select
      @comp_code = COMP_CODE, 
      @dt_code = DOWN_TIME_CODE, 
      @key=MSF420.SHIFT+' '+MSF420.DOWN_TIME_CODE+'01' -- составной ключ
from MSF420
if (@comp_code='МАРК' and @dt_code='ПП') 
begin
 insert into MSF096_STD_VOLAT values ('DT',@key,'0000','60','blablabla','','','','')

end
END
GO

GO
Научитесь писать триггеры.
9 июн 15, 10:40    [17748197]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4279
В вашем триггере нужно использовать объект inserted.
9 июн 15, 10:54    [17748321]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
qsc
Member

Откуда:
Сообщений: 48
в первый раз пишу..... буду благодарна за подсказку
9 июн 15, 10:58    [17748346]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
qsc
в первый раз пишу..... буду благодарна за подсказку

https://msdn.microsoft.com/en-us/library/ms189799.aspx
9 июн 15, 10:59    [17748356]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
SQL2008
В вашем триггере нужно использовать объект inserted.
Прежде всего - не использовать скалярные переменные!

И непонятно, где там "отслеживаем изменение данных".
В триггере на INSERT-то...
9 июн 15, 11:00    [17748366]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
qsc
в первый раз пишу..... буду благодарна за подсказку
CREATE TRIGGER Comments
  on MSF420 
  after INSERT
AS
begin 

set nocount on;

insert into MSF096_STD_VOLAT
select
 'DT',SHIFT+' '+DOWN_TIME_CODE+'01','0000','60','blablabla','','','',''
from
 inserted
where
 COMP_CODE='МАРК' and DOWN_TIME_CODE='ПП';

end;
9 июн 15, 11:07    [17748403]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Попробуйте что-то в таком духе:

CREATE TRIGGER dbo.Comments
	ON dbo.MSF420 
	AFTER INSERT
AS BEGIN 

	SET NOCOUNT ON;

	INSERT INTO dbo.MSF096_STD_VOLAT
	SELECT
		  'DT'
		, i.[SHIFT] + ' ' + i.[DOWN_TIME_CODE] + '01'
		, '0000'
		, '60'
		, 'blablabla', '', '', '', ''
	FROM INSERTED i
	WHERE i.COMP_CODE = N'МАРК' AND i.DOWN_TIME_CODE = N'ПП'

END
GO
9 июн 15, 11:11    [17748430]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
qsc
в первый раз пишу..... буду благодарна за подсказку


Писать что-то в другую таблицу - задача не для триггера, а для процедуры. Как правило, можно избежать ситуации использования триггера в таких целях. Ваше приложение должно вызывать процедуру, а не писать в таблицу напрямую.
9 июн 15, 11:15    [17748461]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
qsc
Member

Откуда:
Сообщений: 48
invm, AlanDenton... после нажатия на кнопку "Подтвердить" снова появляется та же ошибка, что и в скрине
9 июн 15, 11:28    [17748542]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
qsc
снова появляется та же ошибка, что и в скрине

Какое отношение эта ошибка имеет к триггеру и MSSQL вообще ?
9 июн 15, 11:30    [17748554]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
qsc
Member

Откуда:
Сообщений: 48
читала по этой ошибке - AZI6 и получается, что сначала, когда идет ввод данных в окно формы, происходит одна транзакция при обращении к БД, триггер запускает вторую транзакцию и из-за их конфликта происходит прерывание сохранения
9 июн 15, 11:32    [17748570]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
qsc
читала по этой ошибке

Где ? На заборе написано ?

qsc
AZI6 и получается, что сначала, когда идет ввод данных в окно формы, происходит одна транзакция при обращении к БД, триггер запускает вторую транзакцию и из-за их конфликта происходит прерывание сохранения

Не читайте этот бред. И не постите его сюдаю
9 июн 15, 11:34    [17748585]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
qsc
Member

Откуда:
Сообщений: 48
Glory,
в любом случае, эта ошибка возникает только при добавлении триггера
9 июн 15, 11:35    [17748600]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
qsc
в любом случае, эта ошибка возникает только при добавлении триггера

Прежде всего эта огшибка возникает из-за написанной вами программы
А возникает ли она на сервере - это вы как раз и не знаете
9 июн 15, 11:38    [17748619]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
qsc
Member

Откуда:
Сообщений: 48
Glory, программа написана не мной, поэтому посмотреть, что там происходит внутри, я тоже не могу
9 июн 15, 11:45    [17748675]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
qsc
Glory, программа написана не мной, поэтому посмотреть, что там происходит внутри, я тоже не могу

Т.е. вы предлагаете другим это сделать ?
9 июн 15, 11:45    [17748680]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
qsc
Member

Откуда:
Сообщений: 48
Glory,
нет. предполагала, что это из-за триггера. если вы утверждаете обратное, спорить не буду. наверное, так и есть. тогда вопросов больше нет
9 июн 15, 11:49    [17748710]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
qsc
предполагала, что это из-за триггера.

На чем основаны ваши предположения ?
9 июн 15, 11:51    [17748726]     Ответить | Цитировать Сообщить модератору
 Re: рано срабатывает триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
qsc
Glory,
нет. предполагала, что это из-за триггера. если вы утверждаете обратное, спорить не буду. наверное, так и есть. тогда вопросов больше нет
Запустите и настройте профайлер.
Посмотрите, что происходит на сервере,
9 июн 15, 11:53    [17748732]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить