Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / COLUMNS_UPDATED / 19 сообщений из 19, страница 1 из 1
24.08.2011, 17:34
    #37410246
VladBoyr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
В триггере можно использовать функцию UPDATE, чтобы определить какое именно поле изменилось, но для истории проще сохранить целиком COLUMNS_UPDATED. Да только потом возникает вопрос, как с этим набором битов работать. Ну т.е. как работать-то понятно, в справке всё есть, но может есть у кого-то примеры готовых функций, которые бы по имени поля возвращали менялось оно или нет, и наоборот по набору битов возвращали имена полей, которые изменились? Думаю это стоит того, чтобы быть помещённым в FAQ, также как преобразование даты в строку, например. :)

Ну и ещё один щекотливый вопрос, в каких случаях может изменится порядок полей в таблице? Например, столбец удалили, как вариант. Какие ещё "возможности" для этого? :)

З.Ы. Честно признаюсь, поиском по форуму не увлекался, но в тех темах, которые просматривал, изящного решения не нашёл :)
В частности:
http://www.sql.ru/forum/actualthread.aspx?tid=441997
http://www.sql.ru/forum/actualthread.aspx?tid=548011
Число полей естественно больше 8. :)
...
Рейтинг: 0 / 0
24.08.2011, 17:41
    #37410265
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
VladBoyrи наоборот по набору битов возвращали имена полей, которые изменились?
Пример B. Using COLUMNS_UPDATED to test more than eight columns из хелпа разве не делает это ?
...
Рейтинг: 0 / 0
24.08.2011, 17:44
    #37410280
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
VladBoyrВ триггере можно использовать функцию UPDATE, чтобы определить какое именно поле изменилось, но для истории проще сохранить целиком COLUMNS_UPDATED.UPDATE и COLUMNS_UPDATED не возвращает поля, которые изменились.

Сравнивайте значения из inserted и deleted
...
Рейтинг: 0 / 0
24.08.2011, 17:47
    #37410287
Knyazev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
...
Рейтинг: 0 / 0
24.08.2011, 17:56
    #37410305
SamMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
VladBoyrНапример, столбец удалили, как вариант.

Такой вариант прокатывает только как результат команды ALTER TABLE. У UPDATE такое не получится ни в жисть - даже класс команды не тот.
...
Рейтинг: 0 / 0
24.08.2011, 17:58
    #37410309
SamMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
Хотя я может вопрос
VladBoyrНу и ещё один щекотливый вопрос, в каких случаях может изменится порядок полей в таблице?
не так интерпретировал? Тогда - сорри.
...
Рейтинг: 0 / 0
25.08.2011, 15:16
    #37411882
VladBoyr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
alexeyvgVladBoyrВ триггере можно использовать функцию UPDATE, чтобы определить какое именно поле изменилось, но для истории проще сохранить целиком COLUMNS_UPDATED.UPDATE и COLUMNS_UPDATED не возвращает поля, которые изменились.

Сравнивайте значения из inserted и deleted А что же они возвращают? Я вас не понимаю. %)

Мне и не надо в триггере ничего делать. В триггере у меня идёт журналирование, в таблицу History попадают те поля, которые были изменены по update. Мне нужно по прошествии какого-то времени восстановить по истории какие поля изменились. Соответственно, я не могу использовать служебные объекты inserted и deleted, у меня есть лишь поле varbinary(10). Вот для работы с этим полем, для собственного удобства, и написал пару простеньких функций. Задолбался с битовыми масками %)

Базовая функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
alter function dbo.IsItTrue(@Columns_Updated varbinary( 10 ), @ColumnId int)
returns bit
begin
	DECLARE @numchar int, @numbit int
	---
	SET @ColumnId = @ColumnId -  1 
	SET @numchar =(@ColumnId /  8 ) +  1 
	SET @numbit = power( 2 ,@ColumnId %  8 )
	
	IF SUBSTRING(@Columns_Updated,@numchar, 1 ) & @numbit = @numbit return  1  
	
	return  0 
end

Функция №1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
alter function dbo.IsThisUpdated(@Columns_Updated varbinary( 10 ), @Table varchar( 255 ), @Column varchar( 255 ))
returns bit
begin
	DECLARE @ColumnId int
	---
	SET @ColumnId = COLUMNPROPERTY(OBJECT_ID(@Table), @Column, 'ColumnID')
	
	IF dbo.IsItTrue(@Columns_Updated,@ColumnId) =  1  return  1  
	
	return  0 
end

Функция №2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
alter function dbo.WhoIsUpdated(@Columns_Updated varbinary( 10 ), @Table varchar( 255 ))
returns @WhoIsUpdated table (ColumnId int, ColumnName varchar( 255 ))
begin
	Insert Into @WhoIsUpdated (ColumnId, ColumnName) 
	Select column_id, name From sys.columns 
	 Where object_id = OBJECT_ID(@Table)
	   and dbo.IsItTrue(@Columns_Updated,column_id) =  1 

	return
end
...
Рейтинг: 0 / 0
25.08.2011, 15:21
    #37411894
VladBoyr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
SamMan, я наверное просто не очень ясно выразился. %)
Ну в общем, если порядок полей меняется, то мы имеем кучу недостоверной информации в поле ColumnsUpdated.
Таким образом интересует как обезопасить себя от этого? Например:
1. Не удалять столбцы в таблицах.
2. ...
и т.д.?
...
Рейтинг: 0 / 0
25.08.2011, 15:36
    #37411931
SamMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
VladBoyrНу в общем, если порядок полей меняется, то мы имеем кучу недостоверной информации в поле ColumnsUpdated.

Это что за поле такое - ColumnsUpdated? В какой таблице? И как эта гадкая "недостоверная информация" в него попадает?
...
Рейтинг: 0 / 0
25.08.2011, 15:50
    #37411971
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
VladBoyr,

чего-то не понимаю. Вам же уже, кажется, посоветовали забыть о существовании функции COLUMNS_UPDATED()
ввиду её полной практической бесполезности. Ибо она возвращает установленные биты для полей, перечисленных в команде
Код: plaintext
UPDATE [Table] SET Field1=..., Field2=..., Field3=...
Причём результат не зависит от того, поменялось значение поля или нет.
...
Рейтинг: 0 / 0
25.08.2011, 16:01
    #37411993
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
iapпосоветовали забыть о существовании функции COLUMNS_UPDATED()
но если поле не упоминалось в update, можно с уверенностью утверждать, что оно не менялось )
...
Рейтинг: 0 / 0
25.08.2011, 16:18
    #37412032
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
Зайцев Фёдорiapпосоветовали забыть о существовании функции COLUMNS_UPDATED()
но если поле не упоминалось в update, можно с уверенностью утверждать, что оно не менялось )Разве что.
Очень ценно!
...
Рейтинг: 0 / 0
25.08.2011, 16:46
    #37412107
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
VladBoyralexeyvgпропущено...
UPDATE и COLUMNS_UPDATED не возвращает поля, которые изменились.

Сравнивайте значения из inserted и deleted А что же они возвращают? Я вас не понимаю. %)Они возвращают те поля, которые были упомянуты в инструкциях insert/update
VladBoyrСоответственно, я не могу использовать служебные объекты inserted и deleted, у меня есть лишь поле varbinary(10). Почему не можете? Принципы?
...
Рейтинг: 0 / 0
25.08.2011, 16:57
    #37412134
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
alexeyvgVladBoyrпропущено...
А что же они возвращают? Я вас не понимаю. %)Они возвращают те поля, которые были упомянуты в инструкциях insert/update
VladBoyrСоответственно, я не могу использовать служебные объекты inserted и deleted, у меня есть лишь поле varbinary(10). Почему не можете? Принципы?
естественный ключ. нет возможности сопоставить записи из inserted и deleted
...
Рейтинг: 0 / 0
25.08.2011, 17:05
    #37412156
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
Зайцев ФёдорПочему не можете? Принципы?
естественный ключ. нет возможности сопоставить записи из inserted и deleted В смысле, ключ меняется?

Тогда да, ничего не поделаешь.

Но для того случая, когда меняется ключ, нужно считать, что запись со старым ключём удаляется, а с новым - добавляется.

Тогда проще - для тех записей, у которых нет сопоставления inserted и deleted, считаем, что записи добавлены-удалены.
...
Рейтинг: 0 / 0
25.08.2011, 17:08
    #37412166
COLUMNS_UPDATED
VladBoyr,

авторВ триггере у меня идёт журналирование, в таблицу History попадают те поля, которые были изменены по update. Мне нужно по прошествии какого-то времени восстановить по истории какие поля изменились.

вы имена измененных полей историруете или данные в них?
если данные - пихайте в историю неглядя/как-то смотрите на уже имеющуюся историю.
потом уже в выборке из истории схлопывайте/подчищайте или вроде того.

и если у вас нет возможности сопоставить inserted с deleted - как вы потом по истории понимаете, кто это вообще изменился?
...
Рейтинг: 0 / 0
25.08.2011, 17:12
    #37412173
COLUMNS_UPDATED
alexeyvgЗайцев ФёдорПочему не можете? Принципы?
естественный ключ. нет возможности сопоставить записи из inserted и deleted В смысле, ключ меняется?

Тогда да, ничего не поделаешь.

Но для того случая, когда меняется ключ, нужно считать, что запись со старым ключём удаляется, а с новым - добавляется.

Тогда проще - для тех записей, у которых нет сопоставления inserted и deleted, считаем, что записи добавлены-удалены.

вариант - через вьюху с insteadof триггером и дополнительным фейковым полем (старый ключ/какой-то хэш), которое не менять в апдейте. оно придет и в inserted и в deleted со старым значением.
...
Рейтинг: 0 / 0
25.08.2011, 17:14
    #37412181
COLUMNS_UPDATED
вариант - через вьюху с insteadof триггером и дополнительным фейковым полем (старый ключ/какой-то хэш), которое не менять в апдейте. оно придет и в inserted и в deleted со старым значением.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.10.2018, 20:54
    #39721682
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLUMNS_UPDATED
Офигенно!

Спасибо! Реально помогло, а то чуть было не "забил" на updated_column() ....

VladBoyralexeyvgпропущено...
UPDATE и COLUMNS_UPDATED не возвращает поля, которые изменились.

Сравнивайте значения из inserted и deleted А что же они возвращают? Я вас не понимаю. %)

Мне и не надо в триггере ничего делать. В триггере у меня идёт журналирование, в таблицу History попадают те поля, которые были изменены по update. Мне нужно по прошествии какого-то времени восстановить по истории какие поля изменились. Соответственно, я не могу использовать служебные объекты inserted и deleted, у меня есть лишь поле varbinary(10). Вот для работы с этим полем, для собственного удобства, и написал пару простеньких функций. Задолбался с битовыми масками %)

Базовая функция
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
alter function dbo.IsItTrue(@Columns_Updated varbinary(10), @ColumnId int)
returns bit
begin
	DECLARE @numchar int, @numbit int
	---
	SET @ColumnId = @ColumnId - 1
	SET @numchar =(@ColumnId / 8) + 1
	SET @numbit = power(2,@ColumnId % 8)
	
	IF SUBSTRING(@Columns_Updated,@numchar,1) & @numbit = @numbit return 1 
	
	return 0
end



Функция №1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
alter function dbo.IsThisUpdated(@Columns_Updated varbinary(10), @Table varchar(255), @Column varchar(255))
returns bit
begin
	DECLARE @ColumnId int
	---
	SET @ColumnId = COLUMNPROPERTY(OBJECT_ID(@Table), @Column, 'ColumnID')
	
	IF dbo.IsItTrue(@Columns_Updated,@ColumnId) = 1 return 1 
	
	return 0
end



Функция №2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
alter function dbo.WhoIsUpdated(@Columns_Updated varbinary(10), @Table varchar(255))
returns @WhoIsUpdated table (ColumnId int, ColumnName varchar(255))
begin
	Insert Into @WhoIsUpdated (ColumnId, ColumnName) 
	Select column_id, name From sys.columns 
	 Where object_id = OBJECT_ID(@Table)
	   and dbo.IsItTrue(@Columns_Updated,column_id) = 1

	return
end
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / COLUMNS_UPDATED / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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