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

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

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

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

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

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
11.11.2002, 07:26:05
    #32066264
Denis@nk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
Можно по номеру столбца

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
11.11.2002, 07:28:09
    #32066265
kyky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
неподойдет. мне же нужно проверить на разницу значений. а как из динамического запроса вернуть значение в переменную? можно конечно открыть курсор, но в данной ситуации это нежелательно.
кроме того, может есть путь предобразования строки к.. незнаю даже как сказать... к той форме, что требуется в UPDATE для проверки?
...
Рейтинг: 0 / 0
11.11.2002, 07:31:29
    #32066266
kyky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
я незнаю номера колоники :((( небаза а сплошной гимаррой... количество колонок в таблице может динамичиски измениться...
...
Рейтинг: 0 / 0
11.11.2002, 07:36:40
    #32066269
IF UPDATE(some_name) в триггере. проблема!!!
А имя колонки вы знаете до выполнения триггера ?
...
Рейтинг: 0 / 0
11.11.2002, 07:40:17
    #32066270
kyky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
я знаю имя колонки только во время выполнения триггера... если б до, то и проблем небыло бы
...
Рейтинг: 0 / 0
11.11.2002, 08:01:34
    #32066272
Dobro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
Решение в лоб.
Динамически сформировать запрос
SELECT Count(*)
FROM inserted
FULL OUTER JOIN deleted
ON inserted.ПОЛЕ = deleted.ПОЛЕ
WHERE inserted.ПОЛЕ IS NULL OR deleted.ПОЛЕ IS NULL
Соответсвенно, если Count(*) > 0, то значение в ПОЛЕ изменилось.
...
Рейтинг: 0 / 0
11.11.2002, 08:15:50
    #32066276
kyky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
для Dobro

declare @str as char(1024)
set @str='U query'
и как мне провести сравнение на количество?
что то в духе if exec(@str)=0 несрабатывает!!!
...
Рейтинг: 0 / 0
11.11.2002, 08:50:17
    #32066281
IF UPDATE(some_name) в триггере. проблема!!!
......................
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
11.11.2002, 09:50:12
    #32066306
kyky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
для Сергей Рябцун
несрабатывает. значение @result неменяется.
...
Рейтинг: 0 / 0
11.11.2002, 10:03:50
    #32066315
IF UPDATE(some_name) в триггере. проблема!!!
запрос такой ?:
...................................
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
11.11.2002, 15:21:25
    #32066534
Dobro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
Ну вот, уже и сами справились:) Последний вариант Сергей Рябцуна должен работать. Едиственное уточнение: зачем @result объявлять как sql_variant, можно и обычным int обойтись.
...
Рейтинг: 0 / 0
12.11.2002, 06:34:27
    #32066720
IF UPDATE(some_name) в триггере. проблема!!!
Почему-то у меня таблицы Inserted и Deleted он не воспринимает в динамически сформированном запросе. Как этого избежать ? Может создать временные таблицы до создания запроса ?
...
Рейтинг: 0 / 0
12.11.2002, 07:37:25
    #32066726
kyky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
вобщемто последний вариант в триггере наработает :(((
еще вариантов нет?
...
Рейтинг: 0 / 0
12.11.2002, 07:51:23
    #32066729
IF UPDATE(some_name) в триггере. проблема!!!
Уважаемый Glory, подскажите непонятливым "студентам" где наша ошибка :)
...
Рейтинг: 0 / 0
12.11.2002, 08:18:32
    #32066732
IF UPDATE(some_name) в триггере. проблема!!!
2 KyKy
Нарисуйте мне весь свой триггер. Есть идейка ...
...
Рейтинг: 0 / 0
12.11.2002, 08:29:56
    #32066733
kyky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
что то в духе ЭТОГО... понимаю - ужастно... но иначе вообще неиспользуемо выходит...
Код: 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
12.11.2002, 09:55:08
    #32066764
IF UPDATE(some_name) в триггере. проблема!!!
Это у меня работает:

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
12.11.2002, 10:11:50
    #32066769
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF UPDATE(some_name) в триггере. проблема!!!
2Сергей Рябцун
Область видимости специальных таблиц inserted и deleted ограничена триггером.
...
Рейтинг: 0 / 0
12.11.2002, 10:18:33
    #32066772
IF UPDATE(some_name) в триггере. проблема!!!
2Glory
Спасибо. Это я уже сообразил - поэтому переделал триггер немного (сообщение выше).

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


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