powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / IF UPDATE(some_name) в триггере. проблема!!!
25 сообщений из 26, страница 1 из 2
IF UPDATE(some_name) в триггере. проблема!!!
    #32066258
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне необходимо проверить бфла ли обновленна колонка в триггере. причем имя колонки, которую надо проверить на обновление меняется динамическим образом... тоесть для меня оно доступно ТОЛЬКО в виде строки, а UPDATE неможет работать со строкой при проверке.

Мне надо что то в духе

IF UPDATE('dinamik_name')
begin....

как предобразовать 'dinamik_name' чтоб UPDATE сработал? или какие еще есть варианты?

Заранее благодарю за помощь.
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066263
Пример запроса с динамическими именами:

DECLARE @Query nvarchar(512)
DECLARE @fName sysname
DECLARE @lName sysname
DECLARE @Str varchar(20)

Set @fName='NAIMEN'
Set @lName='ZAKAZ'
Set @Str='''%004%'''

SET @Query = 'SELECT [' + @fName + '] FROM Nom where ['+@lName+'] like '+@Str
exec(@Query)

сооруди чего-нибудь подобное
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066264
Denis@nk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно по номеру столбца

This example obtains similar results using the COLUMNS_UPDATED() clause.

CREATE TRIGGER my_trig2
ON my_table
FOR INSERT
AS
IF ( COLUMNS_UPDATED() & 2 = 2 )
PRINT 'Column b Modified'
GO
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066265
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
неподойдет. мне же нужно проверить на разницу значений. а как из динамического запроса вернуть значение в переменную? можно конечно открыть курсор, но в данной ситуации это нежелательно.
кроме того, может есть путь предобразования строки к.. незнаю даже как сказать... к той форме, что требуется в UPDATE для проверки?
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066266
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я незнаю номера колоники :((( небаза а сплошной гимаррой... количество колонок в таблице может динамичиски измениться...
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066269
А имя колонки вы знаете до выполнения триггера ?
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066270
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я знаю имя колонки только во время выполнения триггера... если б до, то и проблем небыло бы
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066272
Dobro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение в лоб.
Динамически сформировать запрос
SELECT Count(*)
FROM inserted
FULL OUTER JOIN deleted
ON inserted.ПОЛЕ = deleted.ПОЛЕ
WHERE inserted.ПОЛЕ IS NULL OR deleted.ПОЛЕ IS NULL
Соответсвенно, если Count(*) > 0, то значение в ПОЛЕ изменилось.
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066276
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для Dobro

declare @str as char(1024)
set @str='U query'
и как мне провести сравнение на количество?
что то в духе if exec(@str)=0 несрабатывает!!!
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066281
......................
DECLARE @result sql_variant
......................
set @str='U query'
execute sp_executesql @str,N'@result sql_variant OUTPUT', @result OUTPUT
select @result
IF @result .......
......................
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066306
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для Сергей Рябцун
несрабатывает. значение @result неменяется.
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066315
запрос такой ?:
...................................
DECLARE @lName sysname
DECLARE @Query nvarchar(1024)
DECLARE @result sql_variant
...................................
SET @Query='SELECT @result=Count(*)
FROM inserted
FULL OUTER JOIN deleted
ON inserted.['+@lName+'] = deleted.['+@lName+']
WHERE inserted.['+@lName+'] IS NULL OR deleted.['+@lName+'] IS NULL'
execute sp_executesql @Query,N'@result sql_variant OUTPUT', @result OUTPUT
select @result
...................................
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066534
Dobro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот, уже и сами справились:) Последний вариант Сергей Рябцуна должен работать. Едиственное уточнение: зачем @result объявлять как sql_variant, можно и обычным int обойтись.
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066720
Почему-то у меня таблицы Inserted и Deleted он не воспринимает в динамически сформированном запросе. Как этого избежать ? Может создать временные таблицы до создания запроса ?
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066726
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вобщемто последний вариант в триггере наработает :(((
еще вариантов нет?
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066729
Уважаемый Glory, подскажите непонятливым "студентам" где наша ошибка :)
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066732
2 KyKy
Нарисуйте мне весь свой триггер. Есть идейка ...
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066733
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что то в духе ЭТОГО... понимаю - ужастно... но иначе вообще неиспользуемо выходит...
Код: plaintext
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
create trigger tr_history_betcd_for_insert
on betcd
for insert, update
as
begin
	declare @id_tbl_links as int
	declare @id_fair as int
	declare @data as varchar( 8000 )
	DECLARE @lName sysname
	DECLARE @Query nvarchar( 1024 )
	DECLARE @result int

	declare cr_select_links scroll cursor for
	select id_tbl_links, return_field from tbl_links
	where has_history =  1  and relation_type =  0  AND ref_table_name = 'betcd'

	OPEN cr_select_links
	FETCH FIRST FROM cr_select_links INTO @id_tbl_links, @lName

	WHILE @@FETCH_STATUS =  0 
	begin
		SET @Query='SELECT @result=Count(*)
		FROM inserted 
		FULL OUTER JOIN deleted 
		ON inserted.['+@lName+'] = deleted.['+@lName+'] 
		WHERE inserted.['+@lName+'] IS NULL OR deleted.['+@lName+'] IS NULL' 

		execute sp_executesql @Query,N'@result int OUTPUT', @result OUTPUT

		if @result >  0 
		begin
			set @Query='select @data=cast('+@lName+' as varchar(8000)) from inserted'
			execute sp_executesql @Query,N'@data varchar(8000) OUTPUT', @data OUTPUT

			insert into history_data (id_tbl_links, id_fair, history_data)
			values (@id_tbl_links, NULL, @data)
		end

		FETCH NEXT FROM cr_select_links INTO @id_tbl_links, @lName
	end
	CLOSE cr_select_links
	DEALLOCATE cr_select_links
end
GO
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066764
Это у меня работает:

begin
.......................
select * into #Ins_tmp from Inserted
select * into #Del_tmp from Deleted
DECLARE @lName sysname
DECLARE @Query nvarchar(1024)
DECLARE @result int
......................
SET @Query='SELECT @result=Count(*)
FROM #Ins_tmp I
FULL OUTER JOIN #Del_tmp D
ON I.['+@lName+'] = D.['+@lName+']
WHERE I.['+@lName+'] IS NULL OR D.['+@lName+']
IS NULL'
execute sp_executesql @Query,N'@result int OUTPUT', @result OUTPUT
select @result as res
drop table #Ins_tmp
drop table #Del_tmp
......................
Кстати, как вы перебираете имена всех полей в таблице Inserted ?
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066769
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Сергей Рябцун
Область видимости специальных таблиц inserted и deleted ограничена триггером.
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066772
2Glory
Спасибо. Это я уже сообразил - поэтому переделал триггер немного (сообщение выше).

Еще вам вопрос: как в триггере перебрать все поля таблицы Inserted, т.е. получить их имена ?
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066797
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю единственная возможность - курсор по syscolumns/sysobjects/INFORMATION_SCHEMA.COLUMNS
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066799
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Сергей Рябцун
polya ishodnoy tablicii kak raz to chto nugno...
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066800
kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
большое спасибо за помощь!!!!
про поля... меня не интересуют ВСЕ поля. только те, то лижат в таблице линк. тут возникает еще такой вопрос. а не будут ли при открытии такого количаства курсоров все работать совсем медленно?
...
Рейтинг: 0 / 0
IF UPDATE(some_name) в триггере. проблема!!!
    #32066819
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kursorov nugno po vozmognosti izbegat.....
tormozyat.... i prichem silno....
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / IF UPDATE(some_name) в триггере. проблема!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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