SQL Server - se puede hacer esto con triggers?

 
Vista:

se puede hacer esto con triggers?

Publicado por Laurea (7 intervenciones) el 24/01/2007 18:38:41
Hola a todos.
Tengo una duda, y os pido por favor que me comuniqueis si esto se puede hacer.

Necesito que cuando se intente hacer una operación de borrado o actualización de una tabla que tiene un campo llamado Definitivo con valores true o false. Si el valor es true, no puede realizarse ni el update ni el delete, y debe dar un mensaje.

Creo que en los triggers no se pueden dar mensajes. ¿Alguien sabe como podría hacerse?
Muchas gracias de antemano.
Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:se puede hacer esto con triggers?

Publicado por Isaías (3308 intervenciones) el 25/01/2007 01:08:56
Claro que se pueden enviar mensajes, aqui un trigger con RAISERROR
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @min_lvl tinyint,
@max_lvl tinyint,
@emp_lvl tinyint,
@job_id smallint
SELECT @min_lvl = min_lvl,
@max_lvl = max_lvl,
@emp_lvl = i.job_lvl,
@job_id = i.job_id
FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id
JOIN jobs j ON j.job_id = i.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
BEGIN
RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
ROLLBACK TRANSACTION
END
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
BEGIN
RAISERROR ('The level for job_id:%d should be between %d and %d.',
16, 1, @job_id, @min_lvl, @max_lvl)
ROLLBACK TRANSACTION
END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:se puede hacer esto con triggers?

Publicado por Laurea (7 intervenciones) el 25/01/2007 09:40:31
Muchas gracias Isaías (por la ayuda y por la rapidez)!! Voy a probarlo cuando tenga un poquito de tiempo. Muchas gracias!! Si me funciona correctamente lo posteo aqui con la solución. Gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un error

Publicado por Laurea (7 intervenciones) el 25/01/2007 18:41:32
Hola a todos.
He intentado hacer esto con un trigger pero me da error. He escrito el siguiente texto

Create trigger DeleteBorrador
On Tabla
For delete
As
Declare @Borrador varchar
Select @Borrador = select Borrador from deleted
If @Borrador='1'
Begin
RAISERROR ('No se puede eliminar el registro porque tiene valor de Borrador=1')
rollback transaction
End


Me da el error de sintaxis incorrecta cerca de la palabra clave 'SELECT'. ¿Alguien me podría indicar que tengo mal?

Otra duda que tengo es que he visto por ahí la sentencia "Create or Replace trigger", ¿alguien me podría explicar la diferencia de poner Create Trigger a Create or Replace Trigger??
Muchas gracias de antemano.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me da un error

Publicado por luishoracio (18 intervenciones) el 25/01/2007 19:33:27
Con el permiso de Isaias Buenas tardes Laurea,

Prueba con esto:

en vez de Select @Borrador = select Borrador from deleted coloca

set @Borrador = (select Borrador from deleted)

y mira a ver como te funciona

Hasta pronto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me da un error

Publicado por Isaías (3308 intervenciones) el 25/01/2007 23:42:50
Es mas practico:

IF EXISTST(SELECT Borrador FROM DELETED WHERE Borrador = 1)
RAISE.........

Aunque vale la pena aclar, que la tabla DELETED, mantiene TODOS los registros que se van a borrar, sea UNO o DIEZ MILLONES de registros.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me sigue dando error

Publicado por Laurea (7 intervenciones) el 26/01/2007 13:42:24
Hola a todos

He probado las 2 soluciones que me habeis dado y me da el error siguiente:
Sintaxis incorrecta cerca de la palabra Select (el error es el mismo en las 2 pruebas).

Os copio las dos formas que he probado, por si me podeis ayudar.

Create trigger DeleteBorrador
On Tabla
For delete
As
Declare @Borrador varchar
IF EXIST(SELECT Borrador FROM DELETED WHERE Borrador = 1)
RAISERROR ('No se puede eliminar el registro porque tiene valor de Borrador=1')
rollback transaction
End

Create trigger DeleteBorrador
On Tabla
For delete
As
Declare @Borrador varchar
Set @Borrador = select Borrador from deleted
If @Borrador='1'
Begin
RAISERROR ('No se puede eliminar el registro porque tiene valor de Borrador=1')
rollback transaction
End

La tabla se llama Tabla y el campo se llama Borrador. No se que puedo estar haciendo mal. Por favor, ayudame, estoy aburrida de buscar y no se porque es, en principio la sintaxis es correcta.

Gracias por vuestra ayuda.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Me sigue dando error

Publicado por Liliana (151 intervenciones) el 26/01/2007 17:53:29
Con el permiso de Isaías y de Luis Horacio:

Para la primera:

Create trigger DeleteBorrador
On Tabla
For delete
As
Declare @Borrador varchar
IF EXISTS(SELECT Borrador FROM DELETED WHERE Borrador = 1)
Begin
RAISERROR ('No se puede eliminar el registro porque tiene valor de Borrador=1', 16, 1)
rollback transaction
End

Para la segunda:

Create trigger DeleteBorrador
On Tabla
For delete
As
Declare @Borrador varchar
Set @Borrador = (select Borrador from deleted )
If @Borrador='1'
Begin
RAISERROR ('No se puede eliminar el registro porque tiene valor de Borrador=1', 16,1)
rollback transaction
End
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error con Update

Publicado por Laurea (7 intervenciones) el 29/01/2007 10:30:10
Muchas gracias Liliana, luishoracio e Isaías. Sin duda, sois todos unos expertos. Muchas gracias, la sintaxis que me ha enviado Liliana me ha funcionado sin problemas, pero ahora quiero hacer que si el campo borrador está a 1, tampoco deje actualizar. He "transformado" el codigo de Liliana poniendo lo siguiente:

Create trigger UpdateBorrador
On Tabla
for update
As
begin
Declare @Borrador varchar
Set @Borrador = (select Borrador from updated )
If @Borrador='1'
Begin
RAISERROR ('No se puede modificar el registro porque tiene valor de Borrador=1', 16,1)
rollback transaction
End

Me da un error: Sintaxis incorrecta cerca de 'Tabla'.

Seguro que estoy cometiendo un error enorme en la sintaxis, pero no lo veo.
¿Podeis ayudarme? Muchisimas gracias por vuestra ayuda. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error con Update

Publicado por Isaías (3308 intervenciones) el 29/01/2007 23:41:44
On Tabla = Debe ir el nombre de la tabla donde vas a crear el trigger
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error con Update

Publicado por Laurea (7 intervenciones) el 01/02/2007 10:26:38
Muchas gracias Isaias por tu interés, pero lo estoy haciendo con una tabla de prueba que se llama "Tabla", por lo que el nombre que va después del ON creo que es correcto. Este es el código:

Create trigger UpdateBorrador
On Tabla
for update
As
begin
Declare @Borrador varchar
Set @Borrador = (select Borrador from updated )
If @Borrador='1'
Begin
RAISERROR ('No se puede modificar el registro porque tiene valor de Borrador=1', 16,1)
rollback transaction
End

¿Podríais decirme cual es el fallo? El error que me da es "Sintaxis incorrecta cerca de 'Tabla'.

Muchisimas graicas chic@s, me estais ayudando mucho. Un saludo muy grande.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error con Update

Publicado por Isaías (3308 intervenciones) el 01/02/2007 20:45:36
CREATE TRIGGER UpdateBorrador
ON NombreDeTuTabla -- Aqui va el nombre de tu tabla.
FOR UPDATE
AS
BEGIN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Error con Update

Publicado por Liliana (151 intervenciones) el 01/02/2007 23:40:54
Hola,
Con el permiso de Isaías (siempre me pregunté qué pasaría que me dijeras "Y quién te dijo que te dí permiso?")...

Si copio tu código en el analizador de consultas, me da el siguiente error:

Servidor: mensaje 170, nivel 15, estado 1, procedimiento UpdateBorrador, línea 12
Línea 12: sintaxis incorrecta cerca de 'End'.

Y es porque falta un End al final del código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error con Update

Publicado por Laurea (7 intervenciones) el 02/02/2007 10:05:41
Buenas chic@s. Estoy ya en mi fase límite de desesperación. Al final he cogido y me he creado la tabla buena, y he puesto los siguientes triggers:

Create trigger DeleteBorrador
On Datos_Basicos
For delete
As
Declare @Borrador varchar
Set @Borrador = (select Borrador from deleted )
If @Borrador='1'
Begin
RAISERROR ('No se puede eliminar el registro porque tiene valor de Borrador=1', 16,1)
rollback transaction
End

Este trigger anterior me ha funcionado correctamente (ATENCIÓN: sólo lleva un end que cierra el bloque if). Pues bien, he cogido este trigger y lo he "trasformado" para el update

Create trigger UpdateBorrador
On Datos_Basicos
For update
As
Declare @Borrador varchar
Set @Borrador = (select Borrador from updated )
If @Borrador='1'
Begin
RAISERROR ('No se puede modificar el registro porque tiene valor de Borrador=1', 16,1)
rollback transaction
End

Solo hay un end (igual que el del delete), y he probado poniendo otro end como me ha indicado Liliana. Me da un error en ambos casos que me dice "sintaxis incorrecta cerca de Datos_Basicos). Si modifico cualquier cosa me da el error, por lo que creo que no es por el nombre de la tabla.

En fin. No se me ocurre nada, sólo que como esta tabla ya tiene un trigger sobre el delete, que no se pueda hacer el del update. No se, es por intentar sacarle lógica a algo. ¿Alguien me podría confirmar esta teoria?

De verdad chic@s, MUCHÍSIMAS GRACIAS!!! Un saludo muy grande.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Error con Update

Publicado por Liliana (151 intervenciones) el 09/02/2007 17:06:43
Hola Laurea,
Me imagino que ya tendrás solucionado tu problema, y solo contesto fuera de fecha por si algún compañero lee esto, que haya una respuesta.

En el query que corregí el 01/02, hay dos BEGIN y un solo END, eso es lo que te produce el error de sintaxis.
En estos que presentás el 02/02, hay un solo BEGIN en cada uno, con su correspondiente END, no es necesario agregar uno más, porque así sí te dará error.

Algo más. Una tabla puede tener varios triggers, incluso por cada instrucción DELETE, INSERT o UPDATE. En la ayuda, está bien explicado el tema Desencadenadores Múltiples.

Saludos,
Liliana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error con Update

Publicado por Isaías (3308 intervenciones) el 02/02/2007 18:56:36
Excelente observacion, 4 (o mas) ojos, ven mejor.

PD: Siempre tendras mi aprobacion amiga.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar