Triggers

23/04/2004 - 19:18 por Leonardo Azpurua | Informe spam
Hola.

Alguien preguntó acerca de la utilidad de los Triggers en el grupo de vb. Lo
referí aquí, pero para darle una idea, le describí el siguiente ejemplo:

"Supón que tienes una tabla de artículos (A) y una de detalles de
movimientos
para esos artículos (D).

Se quiere:
1.- Que las existencias de los articulos en la tabla (A) sólo puedan
variar a consecuencia del registro de un movimiento.
2.- Que el registro de un movimiento actualice automáticamente la
existencia de las tablas de productos.

discúlpame por no utilizar la sintaxis de ningun SGBD, pero no se ninguna lo
suficientemente bien (me gusta que mis aplicaciones trabajen con cualquiera)
de manera que describo los procedimientos en seudocódigo:

Defines un Trigger para el UPDATE de la tabla A:
Si Nuevo.Existencia <> Original.Existencia THEN
Si varTriggerDetalles = Falso
Rechazar el Cambio y Dar Error
De Lo Contrario
varTriggerDetalles = Falso
Fin Si
Fin Si

y defines un Trigger para el INSERT de la tabla D:
varTriggerDetalles = VERDADERO
Ejecutar UPDATE A SET Existencia = Existencia + D.Entradas - D.Salidas"

pero me quedé con la curiosidad de cómo se escribiría eso mismo en Transact
(además que no entiendo como se pueden definir variables persistentes (el
"varTriggerDetalles" que se setea en el INSERT y se lee en el UPDATE).

Claro que podría revisar los BOL y consultar algunos ejemplos, pero para
Uds., viejos zorros de Transact, debe ser un paseo escribir los dos ejemplos
con la sintaxis debida, y ando un poco flojo estos días.

Gracias de antemano

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org

Preguntas similare

Leer las respuestas

#6 Liliana Sorrentino
23/04/2004 - 21:13 | Informe spam
Leonardo,
Yo soy una de esas "niñas del departamento de desarrollo" (los que saben mi
edad tienen prohibido siquiera un atizbo de sonrisa por el vocablo "niña").
Y lo que hice por un tema similar fue crear una auditoría a través del
trigger de actualización de la tabla en cuestión:

CREATE TRIGGER [xx]
ON mitabla
WITH ENCRYPTION FOR DELETE, UPDATE

AS

IF (columns_updated() & ..) > 0 -- fijate el cálculo en los BOL

BEGIN
INSERT audit
SELECT GETDATE(),
(SELECT nt_username FROM master..sysprocesses WHERE spid = @@spid),
(SELECT program_name FROM master..sysprocesses WHERE spid = @@spid),
1, *
FROM deleted

INSERT audit
SELECT GETDATE(),
(SELECT nt_username FROM master..sysprocesses WHERE spid = @@spid),
(SELECT program_name FROM master..sysprocesses WHERE spid = @@spid),
2, *
FROM inserted
END
GO

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:#

"Liliana Sorrentino" escribió en el


mensaje
news:
> Hola Leonardo,
> El ejemplo tiene incluídas todas las operaciones sobre la tabla de
detalle,
> pero podría separarse en tres, según las necesidades.
> Con respecto a la actualización de artículos solo por detalle,


simplemente
> no le daría al operador la posibilidad de modificar ese dato, no veo
> necesario hacer un trigger para eso, siempre y cuando haya entendido tu
> objetivo.

Hola, Liliana:

Muchas gracias por tu ejemplo: sirvió para comenzar a "desasnarme" sobre


el
tema.

El asunto de la restricción no es tan simple. Para seguir con la


suposición,
los niños del departamento de desarrollo tienen pleno acceso a la BD, y no
queremos que ninguno de ellos -que no son operadores sino usuarios
privilegiados de la BD- modifique "accidentalmente" la existencia de un
artículo. No es una necesidad real, sino un ejercicio, y con ellos no vale
el "pensamiento lateral" :-)))

Salud, y Gracias

Leonardo


Respuesta Responder a este mensaje
#7 Maximiliano D. A.
23/04/2004 - 21:15 | Informe spam
JA, cual es tu edad? ;-) por lo menos decime decada de nacimiento ;-)


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Liliana Sorrentino" escribió en el mensaje
news:uZTk%
Leonardo,
Yo soy una de esas "niñas del departamento de desarrollo" (los que saben


mi
edad tienen prohibido siquiera un atizbo de sonrisa por el vocablo


"niña").
Y lo que hice por un tema similar fue crear una auditoría a través del
trigger de actualización de la tabla en cuestión:

CREATE TRIGGER [xx]
ON mitabla
WITH ENCRYPTION FOR DELETE, UPDATE

AS

IF (columns_updated() & ..) > 0 -- fijate el cálculo en los BOL

BEGIN
INSERT audit
SELECT GETDATE(),
(SELECT nt_username FROM master..sysprocesses WHERE spid = @@spid),
(SELECT program_name FROM master..sysprocesses WHERE spid = @@spid),
1, *
FROM deleted

INSERT audit
SELECT GETDATE(),
(SELECT nt_username FROM master..sysprocesses WHERE spid = @@spid),
(SELECT program_name FROM master..sysprocesses WHERE spid = @@spid),
2, *
FROM inserted
END
GO

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g>


escribió
en el mensaje news:#
>
> "Liliana Sorrentino" escribió en el
mensaje
> news:
> > Hola Leonardo,
> > El ejemplo tiene incluídas todas las operaciones sobre la tabla de
> detalle,
> > pero podría separarse en tres, según las necesidades.
> > Con respecto a la actualización de artículos solo por detalle,
simplemente
> > no le daría al operador la posibilidad de modificar ese dato, no veo
> > necesario hacer un trigger para eso, siempre y cuando haya entendido


tu
> > objetivo.
>
> Hola, Liliana:
>
> Muchas gracias por tu ejemplo: sirvió para comenzar a "desasnarme" sobre
el
> tema.
>
> El asunto de la restricción no es tan simple. Para seguir con la
suposición,
> los niños del departamento de desarrollo tienen pleno acceso a la BD, y


no
> queremos que ninguno de ellos -que no son operadores sino usuarios
> privilegiados de la BD- modifique "accidentalmente" la existencia de un
> artículo. No es una necesidad real, sino un ejercicio, y con ellos no


vale
> el "pensamiento lateral" :-)))
>
> Salud, y Gracias
>
> Leonardo
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.661 / Virus Database: 424 - Release Date: 19/04/2004
Respuesta Responder a este mensaje
#8 Leonardo Azpurua
23/04/2004 - 21:24 | Informe spam
"Maximiliano D. A." escribió en el
mensaje news:
Claro se que tu pregunta era como armar el trigger y yo te sali que no lo
armaria ;-), si queres de todos modos te puedo dar un ejemplo de como


armar
el Trigger :-)



Pues eso es fundamentalmente lo que necesito, con fines esencialmente
"educativos".

pd: no soy ningun ZORRO de Tsql, soy de .NET :-)))))))



¿Zorro? Quise poner "lince". Y algún día cercano, tambien seré "de .NET"
(cuanto mas lo conozco mas me enamora).

Fox es para otros ;-)



Si, para "esos"... :-)))

Salud!
Respuesta Responder a este mensaje
#9 Maximiliano D. A.
23/04/2004 - 21:25 | Informe spam
ok si es con fines educativos no hay problema, el de Liliana puede andar muy
bien, pero solo como fines educativos no los pondria en produccion yo.

Suerte


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:

"Maximiliano D. A." escribió en el
mensaje news:
> Claro se que tu pregunta era como armar el trigger y yo te sali que no


lo
> armaria ;-), si queres de todos modos te puedo dar un ejemplo de como
armar
> el Trigger :-)

Pues eso es fundamentalmente lo que necesito, con fines esencialmente
"educativos".

> pd: no soy ningun ZORRO de Tsql, soy de .NET :-)))))))

¿Zorro? Quise poner "lince". Y algún día cercano, tambien seré "de .NET"
(cuanto mas lo conozco mas me enamora).

> Fox es para otros ;-)

Si, para "esos"... :-)))

Salud!







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.661 / Virus Database: 424 - Release Date: 19/04/2004
Respuesta Responder a este mensaje
#10 Maximiliano D. A.
23/04/2004 - 21:26 | Informe spam
:-))))))))) muy bien!! te hacia mas niña ;-)


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Liliana Sorrentino" escribió en el mensaje
news:
Ese "JA" estuvo de más Tengo 47 años recién estrenados, y a mucha


honra!
Todavía me funcionan algunas neuronas...


"Maximiliano D. A." escribió en el
mensaje news:
> JA, cual es tu edad? ;-) por lo menos decime decada de nacimiento ;-)
>
>
> Salu2
> Maxi
>
> Buenos Aires Argentina
> Desarrollador Microsoft 3 Estrellas .NET
>
> MSN:
> Nunca consideres el estudio como una obligación sino como
> una oportunidad para penetrar en el bello y maravillosos
> mundo del saber.
> - Albert Einstein
>
>
>
> "Liliana Sorrentino" escribió en el
mensaje
> news:uZTk%
> > Leonardo,
> > Yo soy una de esas "niñas del departamento de desarrollo" (los que


saben
> mi
> > edad tienen prohibido siquiera un atizbo de sonrisa por el vocablo
> "niña").
> > Y lo que hice por un tema similar fue crear una auditoría a través del
> > trigger de actualización de la tabla en cuestión:
> >
> > CREATE TRIGGER [xx]
> > ON mitabla
> > WITH ENCRYPTION FOR DELETE, UPDATE
> >
> > AS
> >
> > IF (columns_updated() & ..) > 0 -- fijate el cálculo en los BOL
> >
> > BEGIN
> > INSERT audit
> > SELECT GETDATE(),
> > (SELECT nt_username FROM master..sysprocesses WHERE spid = @@spid),
> > (SELECT program_name FROM master..sysprocesses WHERE spid = @@spid),
> > 1, *
> > FROM deleted
> >
> > INSERT audit
> > SELECT GETDATE(),
> > (SELECT nt_username FROM master..sysprocesses WHERE spid = @@spid),
> > (SELECT program_name FROM master..sysprocesses WHERE spid = @@spid),
> > 2, *
> > FROM inserted
> > END
> > GO
> >
> > "Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g>
> escribió
> > en el mensaje news:#
> > >
> > > "Liliana Sorrentino" escribió en el
> > mensaje
> > > news:
> > > > Hola Leonardo,
> > > > El ejemplo tiene incluídas todas las operaciones sobre la tabla de
> > > detalle,
> > > > pero podría separarse en tres, según las necesidades.
> > > > Con respecto a la actualización de artículos solo por detalle,
> > simplemente
> > > > no le daría al operador la posibilidad de modificar ese dato, no


veo
> > > > necesario hacer un trigger para eso, siempre y cuando haya


entendido
> tu
> > > > objetivo.
> > >
> > > Hola, Liliana:
> > >
> > > Muchas gracias por tu ejemplo: sirvió para comenzar a "desasnarme"
sobre
> > el
> > > tema.
> > >
> > > El asunto de la restricción no es tan simple. Para seguir con la
> > suposición,
> > > los niños del departamento de desarrollo tienen pleno acceso a la


BD,
y
> no
> > > queremos que ninguno de ellos -que no son operadores sino usuarios
> > > privilegiados de la BD- modifique "accidentalmente" la existencia de
un
> > > artículo. No es una necesidad real, sino un ejercicio, y con ellos


no
> vale
> > > el "pensamiento lateral" :-)))
> > >
> > > Salud, y Gracias
> > >
> > > Leonardo
> > >
> > >
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.661 / Virus Database: 424 - Release Date: 19/04/2004
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.661 / Virus Database: 424 - Release Date: 19/04/2004
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida