Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удобный Columns_Updated()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Одинаковые изменения на таблицах идентичной структуры. Разный результат.
+
USE tempdb
SET NOCOUNT ON
GO
CREATE TABLE [dbo].[Test1] (
	 [ID]	Int	IDENTITY
	 CONSTRAINT [PK_Test1]	PRIMARY KEY
	,[Del]	Int		NULL
	,[Data]	VarChar(50)	NULL
)
GO
ALTER TABLE [dbo].[Test1]
	DROP COLUMN [Del]
GO
ALTER INDEX [PK_Test1] ON [dbo].[Test1] REBUILD
GO
CREATE TABLE [dbo].[Test2] (
	 [ID]	Int	IDENTITY
	 CONSTRAINT [PK_Test2]	PRIMARY KEY
	,[Data]	VarChar(50)	NULL
)
GO
CREATE TRIGGER [trTest1] ON [dbo].[Test1]
AFTER INSERT,UPDATE,DELETE AS BEGIN
	DECLARE	@CU VarBinary(1) = Columns_Updated()
	PRINT @CU
END
GO
CREATE TRIGGER [trTest2] ON [dbo].[Test2]
AFTER INSERT,UPDATE,DELETE AS BEGIN
	DECLARE	@CU VarBinary(1) = Columns_Updated()
	PRINT @CU
END
GO
INSERT dbo.Test1 VALUES ('Insert')
INSERT dbo.Test2 VALUES ('Insert')

SELECT * FROM dbo.Test1
SELECT * FROM dbo.Test2

UPDATE dbo.Test1 SET Data = 'Update'
UPDATE dbo.Test2 SET Data = 'Update'
GO
DROP TABLE dbo.Test1
DROP TABLE dbo.Test2
GO
Columns_Updated:
0x07
0x03

IDData
1Insert
IDData
1Insert

0x04
0x02



Не, это конечно всё чётко по документации.
Но контролить изменения через Columns_Updated() это костыль: неудобно, "багнуто" и чревато.

KO
2 фев 12, 14:48    [12019533]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Mnior, а где идентичная структура?
2 фев 12, 14:57    [12019660]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mnior,

странно, право, слышать о "контроле изменений через Columns_Updated()"
2 фев 12, 15:01    [12019688]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
не понятно
Guest
Так в чем проблема-то?
2 фев 12, 15:03    [12019701]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kDnZP
Mnior, а где идентичная структура?

Протормозил. Действительно, странно и загадочно. А если так дописать:
ALTER TABLE [dbo].[Test1]
	DROP COLUMN [Data]
ALTER TABLE [dbo].[Test2]
	DROP COLUMN [Data]

ALTER TABLE [dbo].[Test1]
	ADD [Data] VarChar(50)	NULL
ALTER TABLE [dbo].[Test2]
	ADD [Data] VarChar(50)	NULL

то получается:
0x0F
0x07
0x08
0x04
2 фев 12, 15:08    [12019742]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
в чем проблема-то?
Guest
kDnZP
kDnZP
Mnior, а где идентичная структура?

Протормозил. Действительно, странно и загадочно. А если так дописать:
ALTER TABLE [dbo].[Test1]
	DROP COLUMN [Data]
ALTER TABLE [dbo].[Test2]
	DROP COLUMN [Data]

ALTER TABLE [dbo].[Test1]
	ADD [Data] VarChar(50)	NULL
ALTER TABLE [dbo].[Test2]
	ADD [Data] VarChar(50)	NULL

то получается:
0x0F
0x07
0x08
0x04



ещё раз, в чем проблема?

"измененные" столбцы всегда можно определить, достаточно знать как


MSDN
In SQL Server 2008, the ORDINAL_POSITION column of the INFORMATION_SCHEMA.COLUMNS view is not compatible with the bit pattern of columns returned by COLUMNS_UPDATED. To obtain a bit pattern compatible with COLUMNS_UPDATED, reference the ColumnID property of the COLUMNPROPERTY system function when you query the INFORMATION_SCHEMA.COLUMNS view, as shown in the following example.


SELECT TABLE_NAME, COLUMN_NAME,
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2008R2.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';


http://msdn.microsoft.com/en-us/library/ms186329.aspx
2 фев 12, 15:17    [12019824]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
CREATE TRIGGER ... COLUMNS_UPDATED()
2 фев 12, 15:26    [12019906]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap, схему sys и т.п. в бизнес логику не всунешь. Уровень не тот.
Но главное, нормально написать всевозможные условия (вашим способом) тажело и неэффективно (каждый раз в INFORMATION_SCHEMA - тупизна).
Лучше уж тогда на ALTER триггер повесить.
IF (Columns_Updated() NOT IN ([Column3],[Column7])) BEGIN ... -- N раз в коде, во всевозможных местах


Так что всё рубится на корню:
iap
странно, право, слышать о "контроле изменений через Columns_Updated()"
Именно(!), правильней основываться на правах доступа/ролях.

А этот Columns_Updated() даже для костылей плохо пригоден. Context_Info и то лучше.
2 фев 12, 16:40    [12020734]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
в чем проблема-то?
ещё раз, в чем проблема?
В том что это внутри-системная функция (отладочная), а не логическая, как скажем та же Update(<Column>).
Представте что команду UPDATE отменили (только INSERT/DELETE).
2 фев 12, 16:51    [12020897]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mnior
в чем проблема-то?
ещё раз, в чем проблема?
В том что это внутри-системная функция (отладочная), а не логическая, как скажем та же Update(<Column>).
Представте что команду UPDATE отменили (только INSERT/DELETE).
Дело в том, что бесполезность функций UPDATE() и COLUMNS_UPDATED() стремится к бесконечности!
Поэтому и проблемы-то, в сущности, нет никакой.
2 фев 12, 17:03    [12021035]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap
Дело в том, что бесполезность функций UPDATE() и COLUMNS_UPDATED() стремится к бесконечности!
Это как создание топика некоторыми воспринимается как обязательно проблема. А у докторов все больны.
iap
Поэтому и проблемы-то, в сущности, нет никакой.
Это как в обмане зрения. Одни части картинки влияют на восприятие другой.

А всё к тому что COLUMNS_UPDATED() тотально несостоятельна. Независимо, правильно или нет её юзать.
И это всё.

PS: А баги INSERT EXEC тоже собираются неизбежно постоянно. А ещё сюда можно линк кидать. Вот.
2 фев 12, 17:36    [12021431]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
А Update() даёт экономию в выполненых командах. От неё не избавиться в общем случае.
2 фев 12, 17:38    [12021460]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
mike909
Member

Откуда:
Сообщений: 662
Mnior
А Update() даёт экономию в выполненых командах. От неё не избавиться в общем случае.

Мне тоже недавно в одном проекте реально потребовалось точное знание об изменяемых полях в очень навернутых въюшках.
Т.к. их (полей) было ну очень много ~40 и по каждому нужно было проводить тяжелые вычисления, то сначала попоробовал как то так
CREATE TRIGGER [trTest1] ON [dbo].[Test1]
AFTER INSERT,UPDATE,DELETE AS BEGIN
	DECLARE	@CU VarBinary(1000) = Columns_Updated()
  ;with cl as (
    select [column_id], [name], ((c.[column_id]-1) / 8) + 1 as [byte_Idx], (c.[column_id]-1) % 8 as [bit_Idx] 
    from sys.columns as c
    where [object_id] = object_id('[dbo].[Test1]')
  )
  ,cu as (
    SELECT cl.*
    FROM cl
    CROSS APPLY(
      SELECT POWER(2, [bit_Idx]) as [col],  cast(SUBSTRING( @CU, cl.[byte_Idx], 1) as int) as [mask]
    ) as cu
    WHERE cu.col & cu.mask = cu.col
  )
  select @CU, *
  from cu	
END

Затем плюнул и скатился на простой if update()....
Так что присоединяюсь Columns_Updated() - жутко неудобная штука.
А без update() иногда не обойтись.
2 фев 12, 18:27    [12021872]     Ответить | Цитировать Сообщить модератору
 Re: Удобный Columns_Updated()  [new]
Crimean
Member

Откуда:
Сообщений: 13147
дальше оффтоп полный

да о чем вы говорите! сиквел давно сверх-коммерческий продукт. и все, что нам поют о роадмапах - практически фикция. причем чем дальше тем больше. это четко заметно по характеру реакций на фидбек. если раньше были адекватные, хотя временами и асиметричные, ответы то теперь со всех уровней ответ унифицировали - дай бабла - сделаем "as is". короче, к нашему сожалению у власти "продажники", а не "технари"
всмотритесь - большинство фич появилось явно для затыкания реальных дыр в реальных проектах (скорее всего "под внедрение") и мало отношения имеют к собственно развитию сервера. тот же "Columns_Updated" сделан подпереть merge реплику. на беду - документирован. за пределами решения задач аналогичных мерж реплике - действительно бесполезен
сюда же всякие ct, cdc, data collection, мультисерверное администрирование (которое действительно хорошо работало до 2005), планы обслуживания и т.д. и т.п.
из того, чем приятно пользоваться могу только аудит вспомнить. и то только частично. к примеру, возможность аудита построчного изменения данных типа есть. но вы пробовали это использовать? попробуйте! абсолютно бесполезно
2 фев 12, 18:54    [12022000]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить