Anda di halaman 1dari 5

TRIGGERS

Sintaxis bsica:
CREATE TRIGGER trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } AS { sql_statement [ ; ] [ ,...n ]

Trigger_name es el nombre dado al trigger. Es un objeto de la base de datos y su nombre debe ser nico. AFTER indica que el desencadenador slo se activa cuando todas las operaciones especificadas en la instruccin SQL desencadenadora se han ejecutado correctamente. Adems, todas las acciones referenciales en cascada y las comprobaciones de restricciones deben ser correctas para que este desencadenador se ejecute. AFTER es el valor predeterminado cuando slo se especifica la palabra clave FOR. Los desencadenadores AFTER no se pueden definir en las vistas. INSTEAD OF Especifica que se ejecuta el desencadenador en vez de la instruccin SQL desencadenadora, por lo que se suplantan las acciones de las instrucciones desencadenadoras. Como mximo, se puede definir un desencadenador INSTEAD OF por cada instruccin INSERT, UPDATE o DELETE en cada tabla o vista. No obstante, en las vistas es posible definir otras vistas que tengan su propio desencadenador INSTEAD OF. Los desencadenadores INSTEAD OF no se pueden utilizar en vistas actualizables que usan WITH CHECK OPTION. { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } Especifica las instrucciones de modificacin de datos que activan el desencadenador cuando se intenta en esta tabla o vista. Se debe especificar al menos una opcin. En la definicin del desencadenador se permite cualquier combinacin de estas opciones, en cualquier orden. Para los desencadenadores INSTEAD OF, no se permite la opcin DELETE en tablas que tengan una relacin de integridad referencial que especifica una accin ON DELETE en cascada. Igualmente, no se permite la opcin UPDATE en tablas que tengan una relacin de integridad referencial que especifica una accin ON UPDATE en cascada. Ejemplo:

CREATE TRIGGER LowCredit ON Purchasing.PurchaseOrderHeader

AFTER INSERT AS DECLARE @creditrating int, @vendorid int SELECT @creditrating = v.CreditRating, @vendorid = p.VendorID FROM Purchasing.PurchaseOrderHeader p INNER JOIN inserted i ON p.PurchaseOrderID = i.PurchaseOrderID JOIN Purchasing.Vendor v on v.VendorID = i.VendorID IF @creditrating = 5 BEGIN RAISERROR ('Vendor credit rating too low', 16, 1) ROLLBACK TRANSACTION END El cdigo despus de AS (el que se ejecuta en el trigger) sigue las mismas normas que en los procedimientos almacenados). Se explica en stos. Se pueden utilizar no slo sentencias SQL sino tambin estructuras de control.

PROCEDIMIENTOS ALMACENADOS

Sintaxis bsica:
CREATE { PROC | PROCEDURE } procedure_name [({ @parameter data_type } [VARYING][=default ][OUT|OUTPUT]] [ ,...n ] AS { <sql_statement> [;][ ...n ]} @ parameter Es un parmetro del procedimiento. En una instruccin CREATE PROCEDURE se pueden declarar uno o ms parmetros. El usuario debe proporcionar el valor de cada parmetro declarado cuando se llama al procedimiento, a menos que se haya definido un valor predeterminado para el parmetro o se haya establecido en el mismo valor que otro parmetro. Un procedimiento almacenado puede tener un mximo de 2.100 parmetros. Se especifica un nombre de parmetro con un signo (@) como primer carcter. Los parmetros son locales para el procedimiento; los mismos nombres de parmetro se pueden utilizar en otros procedimientos. De manera predeterminada, los parmetros slo pueden ocupar el lugar de expresiones constantes; no se pueden utilizar en lugar de nombres de tabla, nombres de columna o nombres de otros objetos de base de datos. data_type Es el tipo de datos del parmetro y el esquema al que pertenece. Se pueden utilizar todos los tipos de datos, excepto table, como un parmetro de un procedimiento almacenado TransactSQL. Sin embargo, el tipo de datos cursor slo se puede utilizar en parmetros OUTPUT. Cuando se especifica un tipo de datos cursor, deben especificarse tambin las palabras clave VARYING y OUTPUT. Con el tipo de datos cursor, es posible especificar varios parmetros de salida. VARYING Especifica el conjunto de resultados admitido como un parmetro de salida. Este parmetro es creado de forma dinmica por el procedimiento almacenado y su contenido puede variar. Slo se aplica a los parmetros de tipo cursor. default Es un valor predeterminado para el parmetro. Si se define un valor default, el procedimiento se puede ejecutar sin especificar un valor para ese parmetro. El valor predeterminado debe ser una constante o puede ser NULL. Si el procedimiento utiliza el parmetro con la palabra clave LIKE, puede incluir los siguientes caracteres comodn: % _ [] y [^]. OUTPUT Indica que se trata de un parmetro de salida. El valor de esta opcin puede devolverse a la instruccin EXECUTE que llama. Utilice los parmetros OUTPUT para devolver valores al autor de la llamada del procedimiento. Los parmetros text, ntext e image no se pueden utilizar como parmetros OUTPUT. <sql_statement> Una o ms instrucciones Transact-SQL que se van a incluir en el procedimiento. Incluye instrucciones de control de flujo. Declara variables que se utilizan en el procedimiento:: DECLARE @var1 tipo, ..

Para asignar valores: SET @variable=valor Control de flujo: IF condicion BEGIN END ELSE BEGIN END WHILE condicion BEGIN END Condicion es una expression que devuelve un valor verdadero o falso (p.e. A=1). Puede ser una clusula del tipo: EXISTS (SELECT ..) o NOT EXISTS (SELECT .). Ejemplo:
CREATE PROCEDURE altaJugador ( @usuario nvarchar(25), @pass nvarchar(15), @nombre nvarchar(50), @apellidos nvarchar(100), @email nvarchar(100), @sexo char(1), @fechaNacimiento datetime, @avatar int, @aleatorio varchar(50), @resultado int OUTPUT) AS SELECT * FROM jugadores WHERE alias=@usuario IF @@Rowcount>0 BEGIN SET @resultado=-1 RETURN END SELECT * FROM jugadores WHERE email=@email IF @@Rowcount>0 BEGIN SET @resultado=-2 RETURN END INSERT INTO jugadores (alias, pass, nombre, apellidos, email, sexo, fechaNacimiento, avatar, aleatorio) VALUES(@usuario, @pass, @nombre, @apellidos, @email, @sexo, @fechaNacimiento, @avatar, @aleatorio) SET @resultado=@@identity RETURN

Notas: Si se quieren utilizar transacciones hay que especificar BEGIN TRAN nombre al principio de procedimeiento. La transaccin termina con ROLLBACK TRAN nombre O COMMIT TRAN nombre. Los comentarios van entre /* y */ @@ROWCOUNT es el nmero de filas devueltas por un select o actualizadas por un UPDATE o insertadas en un INSERT. @@IDENTITY es el valor de un campo identity al realizar un INSERT. @@ERROR contiene el cdigo de error de la ltima sentencia SQL ejecutada (0 si ha sido correcta). RETURN termina la ejecucin de un procedimiento.

Llamar a un procedimiento en TRANSACT-SQL o desde otro procedimiento. Ejemplo:


EXECUTE @ret_code = GetSalesYTD 'valor1', @SalesYTD = @SalesYTDForSalesPerson El primer parmetro es un valor para un parmetro de entrada. El segundo permite asignar un valor a una variable de un parmetro de salida. @ret_code es el cdigo de retorno al ejecutar un procedimeiento. Es cero si no ha habido errores.