COLUMNS_UDATED() y power

19/01/2004 - 03:03 por YamirGB | Informe spam
Estoy empezando a ver como se hacen los Triggers y he
usado la ayuda de Sql Server para ver como se hace, pero
no e entendio como es que funcionan algunas cosas como el
COLUMNS_UDATED() supongamos que quiero dispara el trigger
solo cuando se modifican las columnas 2 y 5 como
sabria... vi que con el power pero no se como funciona
alguien me ayuda con estos conceptos gracias

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera [MVP]
19/01/2004 - 04:58 | Informe spam
Con pocas columnas a considerar es mas comodo usar UPDATED en vez de
COLUMNS_UPDATED, ya que con UPDATED simplemente mencionas las columnas que
te interesan, haciendo un OR en un IF.

/* estos ejemplos son de los Books Online */

CREATE TABLE my_table*
(a int NULL, b int NULL)
GO

CREATE TRIGGER my_trig
ON my_table
FOR INSERT
AS
IF UPDATE(b)
PRINT 'Column b Modified'
GO

que es equivalente a

CREATE TRIGGER my_trig2
ON my_table
FOR INSERT
AS
IF ( COLUMNS_UPDATED() & 2 = 2 )
PRINT 'Column b Modified'
GO


Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"YamirGB" wrote in message
news:02d201c3de30$7c5caa30$
Estoy empezando a ver como se hacen los Triggers y he
usado la ayuda de Sql Server para ver como se hace, pero
no e entendio como es que funcionan algunas cosas como el
COLUMNS_UDATED() supongamos que quiero dispara el trigger
solo cuando se modifican las columnas 2 y 5 como
sabria... vi que con el power pero no se como funciona
alguien me ayuda con estos conceptos gracias
Respuesta Responder a este mensaje
#2 ulises
19/01/2004 - 05:11 | Informe spam
Supongamos que tienes una tabla con 8 campos y se han modificado las
columnas 2 y 5, entonces se formaría un número binario de la siguiente
forma 00010010 (las columnas 2 y 5 contando de derecha a izquierda
llevan 1).
COLUMNS_UPDATED retorna este patrón de 1s y 0s dentro en un byte (si
existiesen más columnas irián en bytes adiicionales, siempre en
múltiplos de 8).
¿Como verificamos lo que queremos?, transformamos este número binario
a un número decimal y lo comparamos y para ello utilizamos la función
de potencia POWER, el número 00010010 para transformarlo a decimal
debemos obtener la suma de las multiplicaciones de los valores por la
base elevada a la potencia (posición -1) :

0 * POWER ( 2, (8-1) ) +
0 * POWER ( 2, (7-1) ) +
0 * POWER ( 2, (6-1) ) +
1 * POWER ( 2, (5-1) ) +
0 * POWER ( 2, (4-1) ) +
0 * POWER ( 2, (3-1) ) +
1 * POWER ( 2, (2-1) ) +
0 * POWER ( 2, (1-1) )

= 18

Entonces para verificar las columnas que fueron actualizadas solo
realizamos :

IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) = 18

Si probamos con un ejemplo :

CREATE TABLE pruebacu ( campo1 int, campo2 int, campo3 int, campo4
int, campo5 int, capo6 int, campo7 int, campo8 int )
go
CREATE TRIGGER tr_pruebacu ON pruebacu
FOR UPDATE AS
IF ( SUBSTRING(COLUMNS_UPDATED(),1,1) = 18 )
RAISERROR('Verdadero',16,1)
ELSE
RAISERROR('Falso',16,1)
go
INSERT INTO pruebacu VALUES ( 1,1,1,1,1,1,1,1)

si luego ejecutamos dos UPDATE :

UPDATE pruebacu SET campo1 = 2
UPDATE pruebacu SET campo2 = 2, campo5 = 2

tendremos el siguiente resultado :

Server: Msg 50000, Level 16, State 1, Procedure tr_pruebacu, Line 6
Falso

(1 row(s) affected)

Server: Msg 50000, Level 16, State 1, Procedure tr_pruebacu, Line 4
Verdadero

(1 row(s) affected)

Saludos,
Ulises


On Sun, 18 Jan 2004 18:03:52 -0800, "YamirGB"
wrote:

Estoy empezando a ver como se hacen los Triggers y he
usado la ayuda de Sql Server para ver como se hace, pero
no e entendio como es que funcionan algunas cosas como el
COLUMNS_UDATED() supongamos que quiero dispara el trigger
solo cuando se modifican las columnas 2 y 5 como
sabria... vi que con el power pero no se como funciona
alguien me ayuda con estos conceptos gracias
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida