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

Боян, но ни одно найденное решение не сработало - прошу помощи зала.
Чтобы долго не расписывать - код:
Код: 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
02.07.2012, 11:50
    #37862642
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в триггере
IFKГде я туплю и как побороть?
Динамические таблицы inserted/deleted не доступны ни в динанических запросах, ни в вызываемых процедурах
...
Рейтинг: 0 / 0
02.07.2012, 12:01
    #37862660
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в триггере
GloryIFKГде я туплю и как побороть?
Динамические таблицы inserted/deleted не доступны ни в динанических запросах, ни в вызываемых процедурах

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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