powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический SQL в триггере
25 сообщений из 47, страница 1 из 2
Динамический SQL в триггере
    #37862635
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
Уважаемый форум,

Боян, но ни одно найденное решение не сработало - прошу помощи зала.
Чтобы долго не расписывать - код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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



В результате получаю не поле, а его имя. Пробовал и так
Код: sql
1.
SELECT @field FROM Deleted WHERE(SMID=' + @rec_id + ')

и через sp_executesql - нифига. Где я туплю и как побороть? Спасибо заранее!
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862642
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKГде я туплю и как побороть?
Динамические таблицы inserted/deleted не доступны ни в динанических запросах, ни в вызываемых процедурах
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862660
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
GloryIFKГде я туплю и как побороть?
Динамические таблицы inserted/deleted не доступны ни в динанических запросах, ни в вызываемых процедурах

Хм. Че-то не очень верится. Какая разница между строкой SQL где опрашивается таблица Deleted с явным указанием поля и такой же строкой, где подставляется имя поля?
В принципе задача такова: необходимо в зависимости от поля, где произошло изменение данных, получить старое и новое значения. Как еще это сделать, не используя Deleted / Inserted - не знаю. Подскажите, уважаемые. Заранее благодарю! :-)
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862668
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKХм. Че-то не очень верится
Ваше право. Если сообщение об ошибке вам не достаточно.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862676
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
GloryIFKХм. Че-то не очень верится
Ваше право. Если сообщение об ошибке вам не достаточно.

Ну, это ладно - кто хочет, верит, кто хочет - нет. Как насчет конструктивных предложений?
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862705
step_ks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862774
AnaceH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IFK,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 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.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862779
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
step_ksдля начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.

А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862787
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKstep_ksдля начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.

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

если одной командой меняется сразу несколько записей и/или полей, триггер сработает один раз и в deleted будет несколько записей. в документации об этом есть
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862788
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKА в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.То, на что он должен срабатывать, описано в документации.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862789
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKА в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.
Триггера в MSSQL срабатывают один раз на событие.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862791
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKstep_ksдля начала написать так, чтобы триггер хотя бы потенциально правильно работал, когда в deleted > 1 записи и изменения были в более, чем в одном поле.
А в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.
Это не так.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862794
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
DeColo®esIFKА в Deleted не будет больше одной записи, потому как триггер должен срабатывать на изменение каждой записи в одном поле из перечисленных.То, на что он должен срабатывать, описано в документации.

Можно ссылку на документацию, где об этом сказано?
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862798
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
ShakillIFKпропущено...


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

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

У меня нет команды, которая меняет сразу несколько записей и/или полей. Этот триггер сделан для отслеживания изменений, вносимых пользователем вручную. Там, где может меняться сразу несколько записей/полей, я, естественно, делаю триггер по-другому. Задача стоит конкретно: передать в SQL запрос имя поля, которое определяется перед самим запросом. Как это сделать?
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862802
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKУ меня нет команды, которая меняет сразу несколько записей и/или полей. Этот триггер сделан для отслеживания изменений, вносимых пользователем вручную. Там, где может меняться сразу несколько записей/полей, я, естественно, делаю триггер по-другому.Сначала напишем говнокод, потом будем его переписывать? Очень интересный подход.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862818
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKЗадача стоит конкретно: передать в SQL запрос имя поля, которое определяется перед самим запросом. Как это сделать?
Если вы все еще горите желаением усугубить код вашего триггера еще и динамическим запросом, то вам придется перегнать содержимое таблиц inserted/deleted, например, во временные таблицы.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862819
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
Гавриленко Сергей АлексеевичIFKУ меня нет команды, которая меняет сразу несколько записей и/или полей. Этот триггер сделан для отслеживания изменений, вносимых пользователем вручную. Там, где может меняться сразу несколько записей/полей, я, естественно, делаю триггер по-другому.Сначала напишем говнокод, потом будем его переписывать? Очень интересный подход.

Товарищ, давайте не будем переходить на личности. Все здесь крутые хацкеры, я это понимаю. А вот понимают ли крутые хацкеры, что не все такие крутые как они и может быть вообще не хацкеры? И если человек просит помощи, то обычно он надеется получить вразумительный ответ, а не кидание какашками в ответ. Если Вам нечего сказать, кроме как "говнокод" - прошу помолчать. Хорошо? Спасибо большое.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862826
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKТоварищ, давайте не будем переходить на личности. Все здесь крутые хацкеры, я это понимаю. А вот понимают ли крутые хацкеры, что не все такие крутые как они и может быть вообще не хацкеры? И если человек просит помощи, то обычно он надеется получить вразумительный ответ, а не кидание какашками в ответ. Если Вам нечего сказать, кроме как "говнокод" - прошу помолчать. Хорошо? Спасибо большое.Я про вашу личность и слова не сказал. Я говорил про ваш код и ваш подход к решению задачи. Что он плох, вам сказали все. Подумайте об этом.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862830
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решения для аудита до поля часто основываются на генераторах. За счет этого внутри триггера получается длинный, но статический код.
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862831
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
GloryIFKЗадача стоит конкретно: передать в SQL запрос имя поля, которое определяется перед самим запросом. Как это сделать?
Если вы все еще горите желаением усугубить код вашего триггера еще и динамическим запросом, то вам придется перегнать содержимое таблиц inserted/deleted, например, во временные таблицы.

Горю, но что-то мне подсказывает, что по эффективности это будет равно ношению воды в решете. :-(
Нельзя ли другим способом решить изначальную задачу? Задача состоит в выявлении изменений в конкретных полях и занесении этих изменений в таблицу протокола изменений. Поля указаны в триггере. Изменения вносятся вручную пользователями. Спасибо за любые подсказки!
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862841
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джоин инсертед и апдейтед по ПК где инсертед.поле <> апдейтед.поле

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

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

Если мой код плох для выполнения конкретной задачи - предложите Ваш вариант решения или хотя бы подскажите направление. Это и будет помощью, за которой люди обращаются на форум. Ну, кроме прояснения значения слова "говнокод"...
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862848
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFKНельзя ли другим способом решить изначальную задачу? Задача состоит в выявлении изменений в конкретных полях и занесении этих изменений в таблицу протокола изменений. Поля указаны в триггере. Изменения вносятся вручную пользователями. Спасибо за любые подсказки!
Что мешает написать имена полей явно ?
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862849
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
Программист-ЛюбительДжоин инсертед и апдейтед по ПК где инсертед.поле <> апдейтед.поле

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

Угу. Это мне было ясно с самого начала, но хотелось изящества и универсальности хоть какой-то. :-(
...
Рейтинг: 0 / 0
Динамический SQL в триггере
    #37862850
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IFKGloryпропущено...

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

Горю, но что-то мне подсказывает, что по эффективности это будет равно ношению воды в решете. :-(
Нельзя ли другим способом решить изначальную задачу? Задача состоит в выявлении изменений в конкретных полях и занесении этих изменений в таблицу протокола изменений. Поля указаны в триггере. Изменения вносятся вручную пользователями. Спасибо за любые подсказки!
нечетатель, - 12803376
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический SQL в триггере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]