top of page

SQL Server 2008 R2

Oracle Database 11G Express Edition 

           El lenguaje SQL Procedural Language (SQL PL) es un conjunto de sentencias de SQL que apareció en DB2 UDB Versión 7 con el fin de proporcionar las construcciones de procedimientos necesarias para implementar lógica de flujo de control en consultas y operaciones normales de SQL. SQL PL ha evolucionado desde entonces y el conjunto actual de sentencias de SQL PL y características del lenguaje proporciona soporte para llevar a cabo tareas de programación de alto nivel íntegramente en SQL.



            SQL PL es un subconjunto del lenguaje estándar SQL Persistent Stored Modules (SQL/PSM). La especificación del estándar SQL/PSM actual puede encontrarse en ANSI/ISO/IEC 9075-4:1999 Information Technology, Database Language SQL, Part 4: Persistent Stored Modules (SQL/PSM).



             SQL PL tiene una sintaxis sencilla que incluye soporte para variables, sentencias condicionales, sentencias de bucles, sentencias de transferencia de control, sentencias de gestión de errores y sentencias de manipulación de conjuntos de resultados. SQL PL puede utilizarse en distintos contextos, como por ejemplo en rutinas con implementaciones de SQL, y un subconjunto de sentencias de SQL PL puede utilizarse en activadores y sentencias de SQL compuestas dinámicas.

Fundamento Teórico 

  Procedimiento almacenado:



    Al crear un procedimiento almacenado, las instrucciones que contiene se analizan para verificar si son correctas sintácticamente. Si se encuentra algún error, el procedimiento se compila, pero aparece un mensaje con advertencias que indica tal situación.

Un procedimiento almacenado se invoca llamándolo.


       En primer lugar se deben escribir y probar las instrucciones que se incluyen en el procedimiento almacenado, luego, si se obtiene el resultado esperado, se crea el procedimiento.


          Los procedimientos almacenados pueden hacer referencia a tablas, vistas, a funciones definidas por el usuario, a otros procedimientos almacenados.


       Para crear un procedimiento almacenado se emplea la instrucción "create procedure". La sintaxis básica es:


create or replace procedure NOMBREPROCEDIMIENTO
as
begin
INSTRUCCIONES
end;


       El bloque de instrucciones comienza luego de "begin" y acaba con "end".


     Si se utiliza "or replace", se reemplaza un procedimiento existente; si se omite y existe un procedimiento con ese nombre, Oracle mostrará un mensaje de error.


          Para diferenciar los procedimientos almacenados del sistema de los procedimientos almacenados creados por el usuario use un prefijo, por ejemplo "pa_nombreprocedimiento".


   La sintaxis para ejecutar un procedimiento almacenado es:


Execute NOMBREPROCEDIMIENTO;


       Los procedimientos almacenados se eliminan con "drop procedure".


drop procedure NOMBREPROCEDIMIENTO;


      Si el procedimiento que se quiere eliminar no existe, aparece un mensaje de error que indicara tal situación.
Se puede eliminar una tabla referenciada en un procedimiento almacenado, Oracle lo permite, pero luego, al ejecutar el procedimiento, aparecerá un mensaje de error porque la tabla referenciada no existe.


         Si al crear un procedimiento almacenado se coloca "create or replace procedure", el nuevo procedimiento reemplaza al anterior.


         Los procedimientos almacenados son objetos, así que para obtener información de ellos pueden consultarse los siguientes diccionarios.


"user_objects": muestra todos los objetos de la base de datos seleccionada, incluidos los procedimientos. En la columna "object_type" aparece "procedure" si es un procedimiento almacenado.


    En el siguiente ejemplo se solicita todos los objetos que son procedimientos:


select *from user_objects where object_type='PROCEDURE';


"user_procedures": muestra todos los procedimientos almacenados de la base de datos actual.


         En el siguiente ejemplo se solicita información de todos los procedimientos que comienzan con "PA":


select * from user_procedures where object_name like 'PA_%';



Disparadores (Trigger):



      Si se intenta modificar (agregar, actualizar o eliminar) datos de una tabla asociada a un disparador, el disparador se ejecuta (se dispara) en forma automática.



        La diferencia con los procedimientos almacenados del sistema es que los triggers:


 No pueden ser invocados directamente; al intentar modificar los datos de una tabla asociada a un disparador, el disparador se ejecuta automáticamente.


 No reciben y retornan parámetros.
 Son apropiados para mantener la integridad de los datos, no para obtener resultados de consultas.


create or replace trigger NOMBREDISPARADOR
MOMENTO-- before, after o instead of
EVENTO-- insert, update o delete
of CAMPOS-- solo para update
on NOMBRETABLA
NIVEL--puede ser a nivel de sentencia (statement) o de fila (for each row)
when CONDICION--opcional
begin
CUERPO DEL DISPARADOR--sentencias
end NOMBREDISPARADOR;


     Los triggers se crean con la instrucción "create trigger" seguido del nombre del disparador. Si se agrega "or replace" al momento de crearlo y ya existe un trigger con el mismo nombre, tal disparador será borrado y vuelto a crear.


         "MOMENTO" indica donde se disparará el trigger en relación al evento, puede ser BEFORE (antes), AFTER (después) o INSTEAD OF (en lugar de). "before" significa que el disparador se activará antes que se ejecute la operación (insert, update o delete) sobre la tabla, que causó el disparo del mismo. "after" significa que el trigger se activará después que se ejecute la operación que causó el disparo. "instead of" sólo puede definirse sobre vistas, anula la sentencia disparadora, se ejecuta en lugar de tal sentencia (ni antes ni después).


       "EVENTO" especifica la operación (acción, tipo de modificación) que causa que el trigger se dispare (se active), puede ser "insert", "update" o "delete"; Debe colocarse una acción, puede ser más de una, en tal caso se separan con "or". Si "update" lleva una lista de atributos, el trigger sólo se ejecuta si se actualiza algún atributo de la lista.


     "on NOMBRETABLA" indica la tabla (o vista) asociada al disparador;


       "NIVEL" puede ser a nivel de sentencia o de fila. "for each row" indica que el trigger es a nivel de fila, es decir, se activa una vez por cada registro afectado por la operación sobre la tabla, donde una sola operación afecta a varios registros. Los triggers a nivel de sentencia, se activan una sola vez (antes o después de ejecutar la operación sobre la tabla). Si no se especifica, o se especifica "statement", es a nivel de sentencia.


        "CUERPO DEL DISPARADOR" son las acciones que se ejecutan al dispararse el trigger, las condiciones que determinan un intento de inserción, actualización o borrado provoca las acciones que el trigger realizará. El bloque se delimita con "begin... end".


      Entonces, un disparador es un bloque de código asociado a una tabla que se dispara automáticamente antes o después de una sentencia "insert", "update" o "delete" sobre la tabla.


    Se crean con la instrucción "create trigger"se especifica el momento en que se disparará, qué evento lo desencadenará (inserción, actualización o borrado), sobre qué tabla (o vista) y las instrucciones que se ejecutarán.


    Los disparadores pueden clasificarse según tres parámetros:


 el momento en que se dispara: si se ejecutan antes (before) o después (after) de la sentencia.
 el evento que los dispara: insert, update o delete, según se ejecute una de estas sentencias sobre la tabla.


 nivel: depende si se ejecuta para cada fila afectada en la sentencia (por cada fila) o bien una única vez por sentencia independientemente de la filas afectadas (nivel de sentencia).


Consideraciones generales:
      o Las siguientes instrucciones no están permitidas en un desencadenador: create database, alter database, drop database, load database, restore database, load log, reconfigure, restore log, disk init, disk resize.


      o Se pueden crear varios triggers para cada evento, es decir, para cada tipo de modificación (inserción, actualización o borrado) para una misma tabla. Por ejemplo, se puede crear un "insert trigger" para una tabla que ya tiene otro "insert trigger".


Disparador (información)
    Los triggers son objetos, así que para obtener información de ellos pueden consultarse los siguientes diccionarios:


 "user_objects": muestra todos los objetos de la base de datos seleccionada, incluidos los triggers. En la columna "object_type" aparece "trigger" si es un disparador. En el siguiente ejemplo se solicitan todos los objetos que son disparadores:


select *from user_objects where object_type='TRIGGER';


 "user_triggers": muestra todos los triggers de la base de datos actual. Muestra el nombre del desencadenador (trigger_name), si es before o after y si es a nivel de sentencia o por fila (trigger_type), el evento que lo desencadena (triggering_event), a qué objeto está asociado, si tabla o vista (base_object_type), el nombre de la tabla al que está asociado (table_name), los campos, si hay referencias, el estado, la descripción, el cuerpo (trigger_body), etc. En el siguiente ejemplo se solicita información de todos los disparadores que comienzan con "TR":


select trigger_name, triggering_event from user_triggers where trigger_name like 'TR%';


 "user_source": se puede visualizar el código fuente almacenado en un disparador. En el siguiente ejemplo se solicita el código fuente del objeto "TR_insertar_libros":


select *from user_source where name='TR_INSERTAR_LIBROS';


Disparador de inserción a nivel de sentencia
       Dijimos que un disparador está asociado a una tabla y a una operación específica (inserción, actualización o borrado).


       A continuación se verá la creación de un disparador para el evento de inserción: "insert triger".


     La siguiente es la sintaxis para crear un trigger de inserción que se dispare cada vez que se ejecute una sentencia "insert" sobre la tabla especificada, es decir, cada vez que se intenten ingresar datos en la tabla:


create or replace trigger NOMBREDISPARADOR
MOMENTO insert
on NOMBRETABLA
begin
CUERPO DEL TRIGGER;
end NOMBREDISPARADOR;


        Disparador de insercion a nivel de fila (insert trigger for each row)


         Vimos la creación de un disparador para el evento de inserción a nivel de sentencia, es decir, se dispara una vez por cada sentencia "insert" sobre la tabla asociada.


       En caso que una sola sentencia "insert" ingrese varios registros en la tabla asociada, el trigger se disparará una sola vez; si se quire que se active una vez por cada registro afectado, se debe indicar con "for each row".


         La siguiente es la sintaxis para crear un trigger de inserción a nivel de fila, se dispare una vez por cada fila ingresada sobre la tabla especificada:


create or replace trigger NOMBREDISPARADOR
MOMENTO insert
on NOMBRETABLA
for each row
begin
CUERPO DEL TRIGGER;
end NOMBREDISPARADOR;


        Disparador de borrado (nivel de sentencia y de fila)
Dijimos que un disparador está asociado a una tabla y a una operación específica (inserción, actualización o borrado).


        La siguiente es la sintaxis para crear un trigger de eliminación que se dispare cada vez que se ejecute una sentencia "delete" sobre la tabla especificada, es decir, cada vez que se eliminen registros de la tabla:


create or replace trigger NOMBREDISPARADOR
MOMENTO delete
on NOMBRETABLA
NIVEL-- statement o for each row
begin
CUERPO DEL TRIGGER;
end NOMBREDISPARADOR;

  
          Luego de la instrucción "create trigger" o "create or replace trigger" se coloca el nombre del disparador. 


       "MOMENTO" indica donde se disparará el trigger en relación al evento, puede ser BEFORE (antes) o AFTER (después). Se especifica el evento que causa que el trigger se dispare, en este caso "delete", ya que el trigger se activará cada vez que se ejecute la sentencia "delete" sobre la tabla especificada luego de "on".


         En "NIVEL" se especifica si será un trigger a nivel de sentencia (se dispara una sola vez por cada sentencia "delete", aunque la sentencia elimine varios registros) o a nivel de fila (se dispara tantas veces como filas se eliminan en la sentencia "delete").


        Finalmente se coloca el cuerpo del tigger dentro del bloque "begin.. end".


        Se crea un desencadenador a nivel de fila que se dispara cada vez que se ejecuta un "delete" sobre la tabla "libros", en el cuerpo del trigger se especifican las acciones, en este caso, por cada fila eliminada de la tabla "libros", se ingresa un registro en "control" con el nombre del usuario que realizó la eliminación y la fecha.


Disparador de actualización - lista de campos (update trigger)

 

          El trigger de actualización (a nivel de sentencia o de  fila) permite incluir una lista de campos. Si se incluye el nombre de un campo (o varios) luego de "update", el trigger se disparará donde alguno de esos campos (incluidos en la lista) sea actualizado. Si se omite la lista de campos, el trigger se dispara al momento en que cualquier campo de la tabla asociada sea modificado, es decir, por defecto toma todos los campos de la tabla.


        La lista de campos solamente puede especificarse en disparadores de actualización, nunca en disparadores de inserción o borrado.


create or replace trigger NOMBREDISPARADOR
MOMENTO update of CAMPOS
on TABLA
NIVEL--statement o for each row
begin
CUERPODEL DISPARADOR;
end NOMBREDISPARADOR;


       "CAMPOS" son los campos de la tabla asociada que activarán el trigger si son modificados. Pueden incluirse más de uno, en tal caso, se separan con comas.


Disparador de actualizacion a nivel de sentencia (update trigger)
Dijimos que un disparador está asociado a una tabla y a una operación específica (inserción, actualización o borrado).


     La siguiente es la sintaxis para crear un trigger de  actualización a nivel de sentencia, que se dispare cada vez que se ejecute una sentencia "update" sobre la tabla especificada, es decir, cada vez que se intenten modificar datos en la tabla:


create or replace trigger NOMBREDISPARADOR
MOMENTO update
on NOMBRETABLA
statement
begin
CUERPO DEL TRIGGER;
end NOMBREDISPARADOR;


       Luego de la instrucción "create trigger" se coloca el nombre del disparador. Si se agrega "or replace" al momento de crearlo y ya existe un trigger con el mismo nombre, tal disparador será borrado y vuelto a crear.


      "MOMENTO" indica si se disparará el trigger en relación al evento, puede ser BEFORE (antes) o AFTER (después). Se especifica el evento que causa que el trigger se dispare, en este caso "update", ya que el trigger se activará cada vez que se ejecute la sentencia "update" sobre la tabla especificada luego de "on" "statement" significa que es un trigger a nivel de sentencia, es decir, se dispara una sola vez por cada sentencia "update", aunque la sentencia modifique varios registros; como en cualquier trigger, es el valor por defecto si no se especifica.


         Finalmente se coloca el cuerpo del tigger dentro del bloque "begin.. end".


Disparador de múltiples eventos
Un trigger puede definirse sobre más de un evento; en tal caso se separan con "or".
create or replace trigger NOMBREDISPARADOR
MOMENTO-- before, after o instead of
of CAMPO--si alguno de los eventos es update
EVENTOS-- insert, update y/o delete
on NOMBRETABLA
NIVEL--puede ser a nivel de sentencia (statement) o de fila (for each row)
begin
CUERPO DEL DISPARADOR--sentencias
end NOMBREDISPARADOR;

        Si el trigger se define para más de un evento desencadenante, en el cuerpo del mismo se puede emplear un condicional para controlar cuál operación disparó el trigger. Esto permite ejecutar bloques de código según la clase de acción que disparó el desencadenador.


         Para identificar el tipo de operación que disparó el trigger se emplea "inserting", "updating" y "deleting".
Disparador (eliminar)


      Si se elimina una tabla, se eliminan todos los triggers establecidos sobre ella. Para eliminar un trigger se emplea la siguiente sentencia:


drop trigger NOMBRETRIGGER;

Procedimiento almacenado:   

     Los procedimientos almacenados se crean en la base de datos seleccionada, excepto los procedimientos almacenados temporales, que se crean en la base de datos "tempdb".



    En primer lugar se deben escribir y probar las instrucciones que se incluyen en el procedimiento almacenado, luego, si se obtiene el resultado esperado, se crea el procedimiento.

 
     Los procedimientos almacenados pueden hacer referencia a tablas, vistas, a funciones definidas por el usuario, a otros procedimientos y a tablas temporales.
Un procedimiento puede incluir cualquier cantidad y tipo de instrucciones, excepto create default, create procedure, create rule, create trigger y create view.


        Se pueden crear otros objetos, en tal caso se debe especificar el nombre del propietario; se pueden realizar inserciones, actualizaciones, eliminaciones, etc.


      Si un procedimiento almacenado crea una tabla temporal, dicha tabla sólo existe dentro del procedimiento y desaparece al finalizar el mismo. Lo mismo sucede con las variables.


     Para crear un procedimiento almacenado se emplea la instrucción "create procedure". La sintaxis básica es:


create procedure NOMBREPROCEDIMIENTO
as
begin
INSTRUCCIONES
end;


El bloque de instrucciones comienza luego de "begin" y acaba con "end".

  
     Para ejecutar el procedimiento solo basta con escribir la sintaxis:


exec NOMBREPROCEDIMIENTO;


    Los procedimientos almacenados pueden modificarse, por necesidad de los usuarios o por cambios en la estructura de las tablas que referencia.
Un procedimiento almacenado existente puede modificarse con "alter procedure".


alter procedure NOMBREPROCEDIMIENTO
@PARAMETRO TIPO = VALORPREDETERMINADO
as SENTENCIAS;



        Los procedimientos almacenados pueden recibir y devolver información; para ello se emplean parámetros, de entrada y salida, respectivamente.
Los parámetros de entrada posibilitan pasar información a un procedimiento.


     Para que un procedimiento almacenado admita parámetros de entrada se deben declarar variables como parámetros al crearlo. La sintaxis es:


create procedure NOMBREPROCEDIMIENTO
@NOMBREPARAMETRO TIPO =VALORPORDEFECTO
as SENTENCIAS;


       Los parámetros se definen luego del nombre del procedimiento, se comienza el nombre con un signo arroba (@). Los parámetros son locales al procedimiento, es decir, existen solamente dentro del mismo. Pueden declararse varios parámetros por procedimiento, se separan por comas.


     Si el procedimiento es ejecutado, se deben colocarse explícitamente los valores para cada uno de los parámetros (en el orden que fueron definidos), a no ser que se haya definido un valor por defecto, en tal caso, pueden omitirse. Pueden ser de cualquier tipo de dato (excepto cursor).


   Luego de definir un parámetro y su tipo, opcionalmente, se puede especificar un valor por defecto; tal valor es el que asume el procedimiento al ser ejecutado si no recibe parámetros. Si no se coloca valor por defecto, un procedimiento definido con parámetros no puede ejecutarse sin valores para ellos. El valor por defecto puede ser "null" o una constante, también puede incluir comodines si el procedimiento emplea "like".


        Los procedimientos almacenados pueden devolver información; para ello se emplean parámetros de salida. El valor se retorna a quien realizó la llamada con parámetros de salida. Para que un procedimiento almacenado devuelva un valor se debe declarar una variable con la palabra clave "output" al crear el procedimiento:


create procedure NOMBREPROCEDIMIENTO
@PARAMETROENTRADA TIPO =VALORPORDEFECTO,
@PARAMETROSALIDA TIPO=VALORPORDEFECTO output
as
SENTENCIAS
select @PARAMETROSALIDA=SENTENCIAS;


Los parámetros de salida pueden ser de cualquier tipo de datos, excepto text, ntext e image.


     SQL Server guarda el nombre del procedimiento almacenado en la tabla del sistema "sysobjects" y su contenido en la tabla "syscomments".


    Si no quiere que los usuarios puedan leer el contenido del procedimiento puede indicarle a SQL Server que codifique la entrada a la tabla "syscomments" que contiene el texto. Para ello, se debe colocar la opción "with encryption" al crear el procedimiento:


create procedure NOMBREPROCEDIMIENTO
PARAMETROS
with encryption
as INSTRUCCIONES;


       Los procedimientos almacenados se eliminan con "drop procedure", "drop procedure" puede abreviarse con "drop proc".


drop procedure NOMBREPROCEDIMIENTO;

 

    Se recomienda ejecutar el procedimiento almacenado del sistema "sp_depends" para ver si algún objeto depende del procedimiento que se desea eliminar.


          Se puede eliminar una tabla de la cual dependa un procedimiento, SQL Server lo permite, pero luego, al ejecutar el procedimiento, aparecerá un mensaje de error porque la tabla referenciada no existe.
















Disparadores (Trigger):



     Un "trigger" (disparador o desencadenador) es un tipo de procedimiento almacenado que se ejecuta al momento de intentar modificar los datos de una tabla (o vista).



      Se definen para una tabla (o vista) específica. Se crean para conservar la integridad referencial y la coherencia entre los datos entre distintas tablas.


   Si se intenta modificar (agregar, actualizar o eliminar) datos de una tabla en la que se definió un disparador para alguna de estas acciones (inserción, actualización y eliminación), el disparador se ejecuta (se dispara) en forma automática.


     Un trigger se asocia a un evento (inserción, actualización o borrado) sobre una tabla. La diferencia con los procedimientos almacenados del sistema es que los triggers:


    no pueden ser invocados directamente; al intentar modificar los datos de una tabla para la que se ha definido un disparador, el disparador se ejecuta automáticamente.


 no reciben y retornan parámetros.
 son apropiados para mantener la integridad de los datos, no para obtener resultados de consultas.


        Los disparadores, a diferencia de las restricciones "check", pueden hacer referencia a campos de otras tablas. Los disparadores se ejecutan DESPUES de la ejecución de una instrucción "insert", "update" o "delete" en la tabla en la que fueron definidos. Las restricciones se comprueban ANTES de la ejecución de una instrucción "insert", "update" o "delete". Por lo tanto, las restricciones se comprueban primero, si se infringe alguna restricción, el desencadenador no llega a ejecutarse.


      Los triggers se crean con la instrucción "create trigger". Esta instrucción especifica la tabla en la que se define el disparador, los eventos para los que se ejecuta y las instrucciones que contiene.


create triggre NOMBREDISPARADOR
on NOMBRETABLA
for EVENTO- insert, update o delete
as
SENTENCIAS


 "Create trigger" junto al nombre del disparador.
 "On" seguido del nombre de la tabla o vista para la cual se establece el trigger.


 Luego de "for", se indica la acción (evento, el tipo de modificación) sobre la tabla o vista que activará el trigger. Puede ser "insert", "update" o "delete". Debe colocarse al minimo una acción, si se coloca más de una, deben separarse con comas.


 Luego de "as" viene el cuerpo del trigger, se especifican las condiciones y acciones del disparador; es decir, las condiciones que determinan un intento de inserción, actualización o borrado provoca las acciones que el trigger realizará.


Consideraciones generales:
 "Create trigger" debe ser la primera sentencia de un bloque y sólo se puede aplicar a una tabla.


 Un disparador se crea solamente en la base de datos actual pero puede hacer referencia a objetos de otra base de datos.


 Las siguientes instrucciones no están permitidas en un desencadenador: create database, alter database, drop database, load database, restore database, load log, reconfigure, restore log, disk init, disk resize.


 Se pueden crear varios triggers para cada evento, es decir, para cada tipo de modificación (inserción, actualización o borrado) para una misma tabla. Por ejemplo, se puede crear un "insert trigger" para una tabla que ya tiene otro "insert trigger".
Disparador de inserción (insert trigger)


      Se puede crear un disparador para que se ejecute siempre que una instrucción "insert" ingrese datos en una tabla.


create triggre NOMBREDISPARADOR
on NOMBRETABLA
for insert
as
SENTENCIAS


      "Create trigger" junto al nombre del disparador; "on" seguido del nombre de la tabla para la cual se establece el trigger.


     Luego de "for" se coloca el evento (en este caso "insert"), lo que indica que las inserciones sobre la tabla activarán el trigger.


   Luego de "as" se especifican las condiciones y acciones, es decir, las condiciones que determinan un intento de inserción provoca las acciones que el trigger realizará.


      "Rollback transaction" es la sentencia que deshace la transacción, es decir, borra todas las modificaciones que se produjeron en la última transacción, restable todo al estado anterior.


  "Raiserror" muestra un mensaje de error personalizado.


      Para identificar fácilmente los disparadores de otros objetos se recomienda usar un prefijo y darles el nombre de la tabla para la cual se crean junto al tipo de acción.


       La instrucción "writetext" no activa un disparador.
Disparador de borrado (delete trigger)
Se puede crear un disparador para que se ejecute siempre que una instrucción "delete" elimine datos en una tabla.


create triggre NOMBREDISPARADOR
on NOMBRETABLA
for delete
as
SENTENCIAS


      "Create trigger" junto al nombre del disparador; "on" seguido del nombre de la tabla para la cual se establece el trigger.


     Luego de "for" se coloca el evento (en este caso "delete"), lo que indica que las eliminaciones sobre la tabla activarán el trigger.


      Luego de "as" se especifican las condiciones que determinan un intento de eliminación causa las acciones que el trigger realizará.


Disparador de actualización (update trigger)

Se puede crear un disparador para que se ejecute siempre que una instrucción "update" actualice los datos de una tabla.


create triggre NOMBREDISPARADOR
on NOMBRETABLA
for update
as
SENTENCIAS


      "Create trigger" junto al nombre del disparador; "on" seguido del nombre de la tabla para la cual se establece el trigger.


     Luego de "for" se coloca el evento (en este caso "update"), lo que indica que las actualizaciones sobre la tabla activarán el trigger.


    Luego de "as" se especifican las condiciones y acciones, es decir, las condiciones que determinan un intento de modificación provoca las acciones que el trigger realizará.


       Disparador (Instead Off y after trigger)
     También se puede especificar el momento de disparo del trigger. El momento de disparo indica que las acciones (sentencias) del trigger se ejecuten luego de la acción (insert, delete o update) que dispara el trigger o en lugar de la acción.


create triggre NOMBREDISPARADOR
on NOMBRETABLA o VISTA
MOMENTODEDISPARO-- after o instead of
ACCION-- insert, update o delete
as
SENTENCIAS


       Entonces, el momento del disparo especifica cuando deben ejecutarse las acciones (sentencias) que realiza el trigger. Puede ser "después" (after) o "en lugar" (instead of) del evento que lo dispara.


       Si no se especifica el momento del disparo en la creación del trigger, por defecto se establece como "after", es decir, las acciones que el disparador realiza se ejecutan luego del suceso disparador. Los disparadores "instead of" se ejecutan en lugar de la acción desencadenante, es decir, cancelan la acción desencadenante (suceso que disparó el trigger) reemplazándola por otras acciones.


Las opciones de disparo pueden ser:
 "After": el trigger se dispara al momento que las acciones especificadas (insert, delete y/o update) son ejecutadas; todas las acciones en cascada de una restricción "foreign key" y las comprobaciones de restricciones "check" deben realizarse con éxito antes de ejecutarse el trigger. Es la opción por defecto si solamente se coloca "for" (equivalente a "after").


create triggre NOMBREDISPARADOR
on NOMBRETABLA
after | for-- son equivalentes
ACCION-- insert, update o delete
as
SENTENCIAS


 b) "Instead of": sobre escribe la acción desencadenadora del trigger. Se puede definir solamente un disparador de este tipo para cada acción (insert, delete o update) sobre una tabla o vista.


create triggre NOMBREDISPARADOR
on NOMBRETABLA o VISTA
instead of
ACCION-- insert, update o delete
as
SENTENCIAS


Consideraciones:
 Se pueden crear disparadores "instead of" en vistas y tablas.
 No se puede crear un disparador "instead of" en vistas definidas "with check option".
 No se puede crear un disparador "instead of delete" y "instead of update" sobre tablas que tengan una "foreign key" que especifique una acción "on delete cascade" y "on update cascade" respectivamente.
 Los disparadores "after" no pueden definirse sobre vistas.


 No pueden crearse disparadores "after" en vistas ni en tablas temporales; pero pueden referenciar vistas y tablas temporales.


 Si existen restricciones en la tabla del disparador, se comprueban DESPUES de la ejecución del disparador "instead of" y ANTES del disparador "after". Si se infringen las restricciones, se revierten las acciones del disparador "instead of"; en el caso del disparador "after", no se ejecuta.


Disparador (eliminar trigger)
      Los triggers se eliminan con la instrucción "drop trigger":


drop trigger NOMBREDISPARADOR;


      Si el disparador que se intenta eliminar no existe, aparece un mensaje indicándolo, para evitarlo, se verifica su existencia antes de solicitar su eliminación (como con cualquier otro objeto):


if object_id('NOMBREDISPARADOR') is not null
drop trigger NOMBREDISPARADOR;


    Al eliminar una tabla o vista que tiene triggers asociados, todos los triggers asociados se eliminan automáticamente.


Disparador (información)
       Los triggers (disparadores) son objetos, así que para obtener información de ellos pueden usarse los siguientes procedimientos almacenados del sistema y las siguientes tablas:


"sp_help": sin parámetros muestra todos los objetos de la base de datos seleccionada, incluidos los triggers. En la columna "Object_type" aparece "trigger" si es un disparador.


     Si se envía como argumento el nombre de un disparador, se obtendrá el propietario, el tipo de objeto y la fecha de creación.


"sp_helptext": seguido del nombre de un disparador, muestra el texto que define el trigger, excepto si ha sido encriptado.
"sp_depends": retorna 2 resultados:
 el nombre, tipo, campos, etc. de los objetos de los cuales depende el objeto enviado (referenciados por el objeto) y nombre y tipo de los objetos que dependen del objeto nombrado (que lo referencian).


Disparador (modificar trigger)
        Los triggers pueden modificarse y eliminarse.
Al modificar la definición de un disparador se reemplaza la definición existente del disparador por la nueva definición.


alter trigger NOMBREDISPARADOR
NUEVADEFINICION;


Disparador (deshabilitar y habilitar trigger)
      Se puede deshabilitar o habilitar un disparador específico de una tabla o vista, o todos los disparadores que tengan definidos.


        Si se deshabilita un disparador, éste aun existirá, pero al ejecutar una instrucción "insert", "update" o "delete" en la tabla, no se activa.


        Sintaxis para deshabilitar o habilitar un disparador:
alter table NOMBRETABLA
ENABLE | DISABLE trigger NOMBREDISPARADOR;


     Sintaxis para habilitar (o deshabilitar) todos los disparadores de una tabla específica:


alter table NOMBRETABLA
ENABLE | DISABLE TRIGGER all;



bottom of page