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

Откуда:
Сообщений: 15
Возникла проблема с триггером для одной из таблиц.
В целом с SQL знаком 3-й день , так что скорее всего это какая то глупая ошибка , которую не удалось выгуглить.

Опишу задачу. Из стороннего приложения поступают данные в таблицу MS SQL , через odbc. Данные поступают запросами Insert (самый первый запрос , при 'запуске' этой программы) , а дальше уже обновляют эту же строку запросами Update.
Мне же , не имея возможности изменить алгоритмы отправки этих данных , пришлось написать триггер на эту таблицу , по которому при поступлении запросом Insert,Update данные копируются в отдельную таблицу Insert'ом , и таким образом формируется история поступления этих данных.

Проблема в том , что этот триггер почему то не обрабатывает запрос Update. Точнее при его существовании данные таблицы вообще не обновляются ...
Обрабатывается первый запрос Insert , а все последующие игнорируются , при этом каких либо ошибок в экспорте этих данные ни MS SQL , ни Quik не выдает ...

Сам триггер:

ALTER TRIGGER [dbo].[Hist]
ON [dbo].[TableName1]
for insert, update
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT TableName2 ON
insert into TableTekZnah (ID,Pole1,Pole2,Pole3l,Pole4,Pole5,Pole6,Pole7)
select * from TableName1
End

*Триггер простейший , но нагуглить ошибку я так и не смог.
**При изменении на for Update , воспринимается так же только первый запрос с Update , все остальные полностью игнорируются.
29 май 12, 10:19    [12629859]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
Проблема в том , что этот триггер почему то не обрабатывает запрос Update. Точнее при его существовании данные таблицы вообще не обновляются ...

Может потому, что никакой команды UPDATE и не существует ?

Кстати, а зачем вы каждый раз копируете _всю_ таблицу TableName1 ?
29 май 12, 10:30    [12629913]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Volll,

Что это за таблица TableName2 и почему на нее открывается
IDENTITY_INSERT
и не закрывается?
А инсерт делается совсем в другую таблицу TableTekZnah?
29 май 12, 10:33    [12629935]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Glory
Volll
Проблема в том , что этот триггер почему то не обрабатывает запрос Update. Точнее при его существовании данные таблицы вообще не обновляются ...

Может потому, что никакой команды UPDATE и не существует ?

Кстати, а зачем вы каждый раз копируете _всю_ таблицу TableName1 ?


Мне казалось что в триггере при указании условия его срабатывания , идет выполнение соответствующей команды.
Как я уже написал , знаком с MS SQL 3-й день , а работу нужно выполнить срочно. (так скажем , это малая часть работы)

Приложение её полностью обновляет , надобности использовать Inserted нету.
29 май 12, 10:35    [12629946]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Rivkin Dmitry
Volll,

Что это за таблица TableName2 и почему на нее открывается
IDENTITY_INSERT
и не закрывается?
А инсерт делается совсем в другую таблицу TableTekZnah?


Закрывается в триггере уже той таблицы.
Ещё раз , мне нужно копировать эти данные в другую таблицу для их сохранения , так как доступа к алгоритмам отправления запросов у меня нету.
29 май 12, 10:37    [12629960]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Glory
Volll
Проблема в том , что этот триггер почему то не обрабатывает запрос Update. Точнее при его существовании данные таблицы вообще не обновляются ...

Может потому, что никакой команды UPDATE и не существует ?

Кстати, а зачем вы каждый раз копируете _всю_ таблицу TableName1 ?


Можете написать пожалуйста , обработку Update и Insert , подчеркнув разницу. Заранее большое спасибо!
29 май 12, 10:38    [12629969]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
Мне казалось что в триггере при указании условия его срабатывания , идет выполнение соответствующей команды.

Вот именно, что для срабатывания триггера на update, нужна как минимум команда update

Volll
Приложение её полностью обновляет , надобности использовать Inserted нету.

Что такое "полностью обновляет" для INSERT ?
При добавлении 100 записей по одной, в TableTekZnah получится 1+2+3+4+5...+100 записей
29 май 12, 10:38    [12629974]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
*insert into TableName1(ID,Pole1,Pole2,Pole3l,Pole4,Pole5,Pole6,Pole7)

Пропустил при изменении
29 май 12, 10:41    [12629989]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Glory
Volll
Мне казалось что в триггере при указании условия его срабатывания , идет выполнение соответствующей команды.

Вот именно, что для срабатывания триггера на update, нужна как минимум команда update

Volll
Приложение её полностью обновляет , надобности использовать Inserted нету.

Что такое "полностью обновляет" для INSERT ?
При добавлении 100 записей по одной, в TableTekZnah получится 1+2+3+4+5...+100 записей



Только первый запрос приложение это Insert , как я написал в первом посте. Все остальные Update , полностью её переписывают.
29 май 12, 10:42    [12629998]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Volll
Glory
пропущено...

Вот именно, что для срабатывания триггера на update, нужна как минимум команда update

пропущено...

Что такое "полностью обновляет" для INSERT ?
При добавлении 100 записей по одной, в TableTekZnah получится 1+2+3+4+5...+100 записей



Только первый запрос приложение это Insert , как я написал в первом посте. Все остальные Update , полностью её переписывают.


И эти изменения я фиксирую Insert'ом в другую таблицу
29 май 12, 10:44    [12630014]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Glory
Volll
Мне казалось что в триггере при указании условия его срабатывания , идет выполнение соответствующей команды.

Вот именно, что для срабатывания триггера на update, нужна как минимум команда update

Volll
Приложение её полностью обновляет , надобности использовать Inserted нету.

Что такое "полностью обновляет" для INSERT ?
При добавлении 100 записей по одной, в TableTekZnah получится 1+2+3+4+5...+100 записей

И это как раз таки и нужно ...
USE [db1]
GO
/****** Object: Trigger [dbo].[Hist] Script Date: 29.05.2012 10:09:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Hist]
ON [dbo].[TableTekZnahReal]
for update
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT TableTekZnah ON
insert into TableTekZnah (ID,Inst,spros,predl,TekCena,ZiavBuy,ZiavShell,Oborot)
select * from TableTekZnahReal

End


Запутал себя и вас , этим редактированием. Вот запрос на изменение этого триггера.
29 май 12, 10:47    [12630035]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
Вот запрос на изменение этого триггера.

И что мешает в продолжении этого скрипта сделать какой нибудь UPDATE [dbo].[TableTekZnahReal] ?
29 май 12, 10:49    [12630054]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Volll
Glory
пропущено...

Вот именно, что для срабатывания триггера на update, нужна как минимум команда update

пропущено...

Что такое "полностью обновляет" для INSERT ?
При добавлении 100 записей по одной, в TableTekZnah получится 1+2+3+4+5...+100 записей



Только первый запрос приложение это Insert , как я написал в первом посте. Все остальные Update , полностью её переписывают.

Переписывать всю таблицу?! Это по меньшей мере не умно (без обид!) Резепвная таблица будет увеличиваться в объеме в геометрической последовательности, дублируя многократно неизмененные данные. Для чего это надо? Кроме того, время срабатывания триггера каждый раз тоже будет увеличиваться при этом блокируя инсерты.
А вообще, это задачи давно решенные в аудите
29 май 12, 10:52    [12630064]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Rivkin Dmitry
Volll
пропущено...



Только первый запрос приложение это Insert , как я написал в первом посте. Все остальные Update , полностью её переписывают.

Переписывать всю таблицу?! Это по меньшей мере не умно (без обид!) Резепвная таблица будет увеличиваться в объеме в геометрической последовательности, дублируя многократно неизмененные данные. Для чего это надо? Кроме того, время срабатывания триггера каждый раз тоже будет увеличиваться при этом блокируя инсерты.
А вообще, это задачи давно решенные в аудите


Вся это таблица Real , состоит из 1 строки. Которая первым запросом создается (Insert) , а последующими изменяется. Эти изменения накапливаются в другой таблице (которая не Real (хе-хе)) ,и там уже так же обрабатываются ...
В этом плане все нормально.
Задача конечно бредовая , но увы таковы условия кода того приложения.
Даже больше скажу в итоге всего этого , мне ещё пришлось прописывать уведомление другого приложения о изменении последней таблицы. Ну это уже совершенно другая история.

Glory
Volll
Вот запрос на изменение этого триггера.

И что мешает в продолжении этого скрипта сделать какой нибудь UPDATE [dbo].[TableTekZnahReal] ?


Очень прошу можете написать синтаксис... Я это постигаю исключительно гуглением , так как на соответствующие книги времени сейчас нету. Заранее спасибо!
29 май 12, 11:00    [12630142]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Дмитрий_sql
Member

Откуда:
Сообщений: 35
Volll
Возникла проблема с триггером для одной из таблиц.
...
Сам триггер:

ALTER TRIGGER [dbo].[Hist]
ON [dbo].[TableName1]
for insert, update
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT TableName2 ON
insert into TableTekZnah (ID,Pole1,Pole2,Pole3l,Pole4,Pole5,Pole6,Pole7)
select * from TableName1
End

*Триггер простейший , но нагуглить ошибку я так и не смог.
**При изменении на for Update , воспринимается так же только первый запрос с Update , все остальные полностью игнорируются.



Попробуй переписать триггер на такой:

ALTER TRIGGER [dbo].[Hist]
ON [dbo].[TableName1]
for insert, update
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT TableName2 ON
insert into TableTekZnah (ID,Pole1,Pole2,Pole3l,Pole4,Pole5,Pole6,Pole7)
select * from inserted
End

и ещё, инструкция SET IDENTITY_INSERT TableName2 ON не очень хороша для триггера.
Как вариант сними автоинкремент на поле ID в таблице TableTekZnah. Или если автоинкремент нужен, добавь поле TableName1_id типа int как связку с таблицей TableName1 (Foreign key)
29 май 12, 11:04    [12630175]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Дмитрий_sql
Volll
Возникла проблема с триггером для одной из таблиц.
...
Сам триггер:

ALTER TRIGGER [dbo].[Hist]
ON [dbo].[TableName1]
for insert, update
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT TableName2 ON
insert into TableTekZnah (ID,Pole1,Pole2,Pole3l,Pole4,Pole5,Pole6,Pole7)
select * from TableName1
End

*Триггер простейший , но нагуглить ошибку я так и не смог.
**При изменении на for Update , воспринимается так же только первый запрос с Update , все остальные полностью игнорируются.



Попробуй переписать триггер на такой:

ALTER TRIGGER [dbo].[Hist]
ON [dbo].[TableName1]
for insert, update
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT TableName2 ON
insert into TableTekZnah (ID,Pole1,Pole2,Pole3l,Pole4,Pole5,Pole6,Pole7)
select * from inserted
End

и ещё, инструкция SET IDENTITY_INSERT TableName2 ON не очень хороша для триггера.
Как вариант сними автоинкремент на поле ID в таблице TableTekZnah. Или если автоинкремент нужен, добавь поле TableName1_id типа int как связку с таблицей TableName1 (Foreign key)

Автоинкремент все же нужен , потому что эта первая таблица может чиститься , а результаты предыдущих запросов нужно хранить , причем в не измененной последовательности. С ключами проблем нету , вроде как , хотя попробую все же.
29 май 12, 11:10    [12630214]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
insert into TableTekZnah (ID,Pole1,Pole2,Pole3l,Pole4,Pole5,Pole6,Pole7)
select * from inserted
End

Инсертед не подходит так как в Update может измениться лишь часть полей , а хранить нужно все строку.
29 май 12, 11:12    [12630226]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
Очень прошу можете написать синтаксис... Я это постигаю исключительно гуглением , так как на соответствующие книги времени сейчас нету. Заранее спасибо!

UPDATE [dbo].[TableTekZnahReal] SET [Oborot] = 0
29 май 12, 11:13    [12630237]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
Инсертед не подходит так как в Update может измениться лишь часть полей , а хранить нужно все строку.

А в Инсертед по-вашему только часть полей что ли ?
29 май 12, 11:14    [12630242]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Glory
Volll
Инсертед не подходит так как в Update может измениться лишь часть полей , а хранить нужно все строку.

А в Инсертед по-вашему только часть полей что ли ?

До этого момента думал , что да.
29 май 12, 11:17    [12630267]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
До этого момента думал , что да.

Лучше все таки начать с чтения книжек
А то такой код напишите, что от только вред будет.
29 май 12, 11:18    [12630277]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Glory
Volll
Очень прошу можете написать синтаксис... Я это постигаю исключительно гуглением , так как на соответствующие книги времени сейчас нету. Заранее спасибо!

UPDATE [dbo].[TableTekZnahReal] SET [Oborot] = 0


Вопрос только зачем это нужно , если запросы через odbc идут именно на изменение этих полей.

На счет Inserted'а , это ничего не меняет же. Таблица в любом случае останется той же размерности , а запрос на изменение другой будет тот же.


Ещё раз обозначу.... Проблема в том , что эти поля обновляются лишь 1 раз ! В случае если убрать этот триггер , обновление таблицы будет абсолютно правильным.
Т.e. Каждый 5 секунд , данные таблицы будут обновляться соответственно запросам из приложения.

Триггером я хотел просто копировать эти изменения в другую таблицу.

Возможно я опять не понял , наверное потому что тороплюсь. Это дипломная работа , и доля этой части в ней , абсолютно мизерна. Конечно надо прочесть ряд книг , и я это обязательно сделаю , но сначала сдав эту гадость...
29 май 12, 11:24    [12630326]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
Вопрос только зачем это нужно , если запросы через odbc идут именно на изменение этих полей.

Затем, что вы утверждаете, что "Проблема в том , что этот триггер почему то не обрабатывает запрос Update."

Volll
Это дипломная работа

Еще одни "диплом за 48 часов". Мда
29 май 12, 11:27    [12630342]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Volll
Member

Откуда:
Сообщений: 15
Glory
Volll
Вопрос только зачем это нужно , если запросы через odbc идут именно на изменение этих полей.

Затем, что вы утверждаете, что "Проблема в том , что этот триггер почему то не обрабатывает запрос Update."

Volll
Это дипломная работа

Еще одни "диплом за 48 часов". Мда


Вот запрос Update , из внешнего приложения.
-UPDATE db1.dbo.TableTekZnahReal SET TekCena=81.00, spros=858721, predl=867813, ZiavBuy=2104, ZiavShell=3020, Oborot=809.90 WHERE Inst='Сбербанк [А1-Акции]'"


И ОН не воспринимается в случае наличия триггера на Insert в другую таблицу. Точнее воспринимается , но только 1 и если пропустить запрос первичный.

Нет этот диплом за пол года , это так скажем к нему доработка.
29 май 12, 11:31    [12630370]     Ответить | Цитировать Сообщить модератору
 Re: Триггер for Insert,update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volll
И ОН не воспринимается в случае наличия триггера на Insert в другую таблицу. Точнее воспринимается , но только 1 и если пропустить запрос первичный.

Ваш сленг непонятен.
Триггер может срабатывать или не срабатывать.
И в том и в другом случаях нужны не ваши ощущения о работе триггера, а лог/трасса его выполнения.
29 май 12, 11:33    [12630388]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить