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

Откуда: Гондурас
Сообщений: 1034
Уважаемый форум,

Боян, но ни одно найденное решение не сработало - прошу помощи зала.
Чтобы долго не расписывать - код:
ALTER TRIGGER [dbo].[SRA_Log] 
   ON  [dbo].[tbl_SRA]
   AFTER UPDATE
AS 
	DECLARE @rec_id varchar(10), @field varchar(50), @value_before varchar(100), @value_after varchar(100), @usrn varchar(25), @SQL_STR varchar(100)
IF UPDATE(cpa_Decision) OR UPDATE (cpa_Case_From) OR UPDATE (cpa_Case_To) OR UPDATE ([cpa_Decision_Date]) OR UPDATE ([cpa_Leaf_No])
OR UPDATE ([cpa_Stage]) OR UPDATE ([cpa_Sample_Out]) OR UPDATE ([cpa_Change_Date]) OR UPDATE ([cpa_Decision_Old])
BEGIN
	SET NOCOUNT ON;
	Set @rec_id=(SELECT SMID FROM Deleted)
	Set @field=''
	IF (SELECT cpa_Decision FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Decision FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Decision'
	IF (SELECT cpa_Case_From FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Case_From FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Case_From'
	IF (SELECT cpa_Case_To FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Case_To FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Case_To'
	IF (SELECT cpa_Decision_Date FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Decision_Date FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Decision_Date'
	IF (SELECT cpa_Leaf_No FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Leaf_No FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Leaf_No'
	IF (SELECT cpa_Stage FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Stage FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Stage'
	IF (SELECT cpa_Sample_Out FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Sample_Out FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Sample_Out'
	IF (SELECT cpa_Change_Date FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Change_Date FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Change_Date'
	IF (SELECT cpa_Decision_Old FROM Deleted WHERE(SMID=@rec_id))<>(SELECT cpa_Decision_Old FROM Inserted WHERE(SMID=@rec_id))
		Set @field='cpa_Decision_Old'
		
	Set @SQL_STR=('SELECT ' + @field + ' FROM Deleted WHERE(SMID=' + @rec_id + ')') <= здесь нужно получить значение поля, которо подставляется из переменной @field
	Set @usrn=RIGHT(suser_name(), LEN(suser_name())-8)
	Set @usrn=(SELECT usr_Name FROM DIM_Users WHERE(usr_Login=@usrn))
	EXEC Logging_Changes @rec_id, 'tbl_SRA', @field, @value_before, @value_after, @usrn


В результате получаю не поле, а его имя. Пробовал и так
SELECT @field FROM Deleted WHERE(SMID=' + @rec_id + ')
и через sp_executesql - нифига. Где я туплю и как побороть? Спасибо заранее!
2 июл 12, 11:48    [12802898]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Где я туплю и как побороть?

Динамические таблицы inserted/deleted не доступны ни в динанических запросах, ни в вызываемых процедурах
2 июл 12, 11:50    [12802916]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Glory
IFK
Где я туплю и как побороть?

Динамические таблицы inserted/deleted не доступны ни в динанических запросах, ни в вызываемых процедурах


Хм. Че-то не очень верится. Какая разница между строкой SQL где опрашивается таблица Deleted с явным указанием поля и такой же строкой, где подставляется имя поля?
В принципе задача такова: необходимо в зависимости от поля, где произошло изменение данных, получить старое и новое значения. Как еще это сделать, не используя Deleted / Inserted - не знаю. Подскажите, уважаемые. Заранее благодарю! :-)
2 июл 12, 12:01    [12802979]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Хм. Че-то не очень верится

Ваше право. Если сообщение об ошибке вам не достаточно.
2 июл 12, 12:04    [12802998]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Glory
IFK
Хм. Че-то не очень верится

Ваше право. Если сообщение об ошибке вам не достаточно.


Ну, это ладно - кто хочет, верит, кто хочет - нет. Как насчет конструктивных предложений?
2 июл 12, 12:07    [12803020]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
step_ks
Member

Откуда:
Сообщений: 936
для начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.
2 июл 12, 12:18    [12803128]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
AnaceH
Member

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

 insert into dbo.tLog select i.*, d.value as oldValue
  from 
 (select id, value, colName from (select * from inserted i) i
 unpivot (value for colName in (name, surname)) u) i
 join
 (select id, value, colName from (select * from deleted d) d
 unpivot (value for colName in (name, surname)) u) d
 on i.id = d.id
 and i.colName = d.colName
 and i.value <> d.value

И не нужен динамический sql.
2 июл 12, 12:55    [12803376]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
step_ks
для начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.


А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.
2 июл 12, 12:56    [12803390]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
IFK
step_ks
для начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.


А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.


если одной командой меняется сразу несколько записей и/или полей, триггер сработает один раз и в deleted будет несколько записей. в документации об этом есть
2 июл 12, 12:59    [12803411]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
IFK
А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.
То, на что он должен срабатывать, описано в документации.
2 июл 12, 13:00    [12803413]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.

Триггера в MSSQL срабатывают один раз на событие.
2 июл 12, 13:00    [12803415]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
IFK
step_ks
для начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.

А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.

Это не так.
2 июл 12, 13:01    [12803429]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
DeColo®es
IFK
А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.
То, на что он должен срабатывать, описано в документации.


Можно ссылку на документацию, где об этом сказано?
2 июл 12, 13:02    [12803438]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Shakill
IFK
пропущено...


А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.


если одной командой меняется сразу несколько записей и/или полей, триггер сработает один раз и в deleted будет несколько записей. в документации об этом есть


У меня нет команды, которая меняет сразу несколько записей и/или полей. Этот триггер сделан для отслеживания изменений, вносимых пользователем вручную. Там, где может меняться сразу несколько записей/полей, я, естественно, делаю триггер по-другому. Задача стоит конкретно: передать в SQL запрос имя поля, которое определяется перед самим запросом. Как это сделать?
2 июл 12, 13:05    [12803453]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
IFK
У меня нет команды, которая меняет сразу несколько записей и/или полей. Этот триггер сделан для отслеживания изменений, вносимых пользователем вручную. Там, где может меняться сразу несколько записей/полей, я, естественно, делаю триггер по-другому.
Сначала напишем говнокод, потом будем его переписывать? Очень интересный подход.
2 июл 12, 13:07    [12803464]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Задача стоит конкретно: передать в SQL запрос имя поля, которое определяется перед самим запросом. Как это сделать?

Если вы все еще горите желаением усугубить код вашего триггера еще и динамическим запросом, то вам придется перегнать содержимое таблиц inserted/deleted, например, во временные таблицы.
2 июл 12, 13:14    [12803531]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Гавриленко Сергей Алексеевич
IFK
У меня нет команды, которая меняет сразу несколько записей и/или полей. Этот триггер сделан для отслеживания изменений, вносимых пользователем вручную. Там, где может меняться сразу несколько записей/полей, я, естественно, делаю триггер по-другому.
Сначала напишем говнокод, потом будем его переписывать? Очень интересный подход.


Товарищ, давайте не будем переходить на личности. Все здесь крутые хацкеры, я это понимаю. А вот понимают ли крутые хацкеры, что не все такие крутые как они и может быть вообще не хацкеры? И если человек просит помощи, то обычно он надеется получить вразумительный ответ, а не кидание какашками в ответ. Если Вам нечего сказать, кроме как "говнокод" - прошу помолчать. Хорошо? Спасибо большое.
2 июл 12, 13:15    [12803532]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
IFK
Товарищ, давайте не будем переходить на личности. Все здесь крутые хацкеры, я это понимаю. А вот понимают ли крутые хацкеры, что не все такие крутые как они и может быть вообще не хацкеры? И если человек просит помощи, то обычно он надеется получить вразумительный ответ, а не кидание какашками в ответ. Если Вам нечего сказать, кроме как "говнокод" - прошу помолчать. Хорошо? Спасибо большое.
Я про вашу личность и слова не сказал. Я говорил про ваш код и ваш подход к решению задачи. Что он плох, вам сказали все. Подумайте об этом.
2 июл 12, 13:18    [12803561]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Решения для аудита до поля часто основываются на генераторах. За счет этого внутри триггера получается длинный, но статический код.
2 июл 12, 13:18    [12803568]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Glory
IFK
Задача стоит конкретно: передать в SQL запрос имя поля, которое определяется перед самим запросом. Как это сделать?

Если вы все еще горите желаением усугубить код вашего триггера еще и динамическим запросом, то вам придется перегнать содержимое таблиц inserted/deleted, например, во временные таблицы.


Горю, но что-то мне подсказывает, что по эффективности это будет равно ношению воды в решете. :-(
Нельзя ли другим способом решить изначальную задачу? Задача состоит в выявлении изменений в конкретных полях и занесении этих изменений в таблицу протокола изменений. Поля указаны в триггере. Изменения вносятся вручную пользователями. Спасибо за любые подсказки!
2 июл 12, 13:19    [12803570]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Джоин инсертед и апдейтед по ПК где инсертед.поле <> апдейтед.поле

Писать статический код для каждого поля.
2 июл 12, 13:22    [12803602]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Гавриленко Сергей Алексеевич
IFK
Товарищ, давайте не будем переходить на личности. Все здесь крутые хацкеры, я это понимаю. А вот понимают ли крутые хацкеры, что не все такие крутые как они и может быть вообще не хацкеры? И если человек просит помощи, то обычно он надеется получить вразумительный ответ, а не кидание какашками в ответ. Если Вам нечего сказать, кроме как "говнокод" - прошу помолчать. Хорошо? Спасибо большое.
Я про вашу личность и слова не сказал. Я говорил про ваш код и ваш подход к решению задачи. Что он плох, вам сказали все. Подумайте об этом.


Хорошо, значит, я неправильно интерпретировал значение слова "говнокод" в приложении к моему случаю. Постараюсь употреблять это слово на форуме почаще - оказывается оно не имеет никакого отношения к личности.

Если мой код плох для выполнения конкретной задачи - предложите Ваш вариант решения или хотя бы подскажите направление. Это и будет помощью, за которой люди обращаются на форум. Ну, кроме прояснения значения слова "говнокод"...
2 июл 12, 13:24    [12803616]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Нельзя ли другим способом решить изначальную задачу? Задача состоит в выявлении изменений в конкретных полях и занесении этих изменений в таблицу протокола изменений. Поля указаны в триггере. Изменения вносятся вручную пользователями. Спасибо за любые подсказки!

Что мешает написать имена полей явно ?
2 июл 12, 13:25    [12803625]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Программист-Любитель
Джоин инсертед и апдейтед по ПК где инсертед.поле <> апдейтед.поле

Писать статический код для каждого поля.


Угу. Это мне было ясно с самого начала, но хотелось изящества и универсальности хоть какой-то. :-(
2 июл 12, 13:25    [12803629]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL в триггере  [new]
qwerty112
Guest
IFK
Glory
пропущено...

Если вы все еще горите желаением усугубить код вашего триггера еще и динамическим запросом, то вам придется перегнать содержимое таблиц inserted/deleted, например, во временные таблицы.


Горю, но что-то мне подсказывает, что по эффективности это будет равно ношению воды в решете. :-(
Нельзя ли другим способом решить изначальную задачу? Задача состоит в выявлении изменений в конкретных полях и занесении этих изменений в таблицу протокола изменений. Поля указаны в триггере. Изменения вносятся вручную пользователями. Спасибо за любые подсказки!

нечетатель, - 12803376
2 июл 12, 13:25    [12803633]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить