EQUIPO 9 FRAGOSO PEÑA FERNANDO HUERTA GÓMEZ DANIEL PÉREZ OCHOA VALERI PÉREZ SAN JUAN ALDO PAILLES RUBIÑOS FRANCISCO NICOLÁS TRIGGERS
TRIGGERS Los Triggers (desencadenadores), es un mecanismo primario que provee SQL Server, y consiste en una especialización de los procedimientos almacenados que se activa cuando se ejecutan sentencias que modifican los datos o sus estructuras de alguna manera.  DML DDL
Desencadenadores  DML Aplicar cambios en cascada sobre las tablas. Evitar sentencias maliciosas de  INSERT, UPDATE  y  DELETE. Llevar auditor ía en tablas al efecto, de los cambios realizados en la base de datos. Evaluar el estado de una tabla antes y después de los cambios. Mantener actualizadas tablas totalizadoras. Mantener actualizados campos calculados. Tipos de desencadenadores DML: AFTER INSTEAD OF .NET
Comparación de desencadenadores  AFTER  e  INSTEAD OF   FUNCIÓN AFTER INSTED OF Uso Tablas Tablas y vistas Cantidad por tabla o vista Múltiple por acción de INSERT, UPDATE o DELETE. Uno por acción de INSERT, UPDATE o DELETE. Acción en cascada No tiene restricciones. INSTED OF UPDATE y DELETE no están Permitidos en tablas que son destino de Acciones de integridad referencial en cascada. Ejecución Después: Proceso de restricciones. Acciones de integridad referencial declarativa. Creación de tablas  inserted  y deleted. Acción del trigger. Creación de tablas inserted y deleted. Antes: Proceso de restricciones. En lugar de: Acción del desencadenador. Orden de ejecución Se debe especificar orden. No aplicable. Referencias a columnas varchar(MAX), nvarchar(MAX), Y varbinary(MAX) en tablas Inserted y deleted. Permitida. Permitida. Referencias a columnas text, Ntext e image en tablas Inserted y deleted. No permitida. Permitida.
Existen dos tablas especiales que intervienen en los desencadenadores:  Inserted  Deleted  La tabla deleted almacena copia de las filas afectadas durante la ejecución de sentencias  UPDATE  o  DELETE La tabla inserted también almacena las filas afectadas, pero durante la ejecución de sentencias  INSERT  o  UPDATE. Ambas son creadas y administradas en forma automática por SQL Server con el objeto de mantener los datos intermedios durante el proceso de un desencadenador.
Estas tablas se pueden utilizar para: Extender la integridad referencial entre tablas. Insertar o modificar datos en las tablas de base de vista. Controlar errores y tomar acción. Hallar la diferencia entre estados entre la tabla original y los cambios producidos.
Desencadenadores DDL Los desencadenadores  DDL,  pueden tener alcance de base de datos o de servidor (reaccionan ante ciertos eventos disparados en ambos ámbitos). CREATE TRIGGER TRG_TBLAdvertencia ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS PRINT  ‘Debe deshabilitar el desencadenador  TRG_IUD_AUDIT  para ejecutar esta sentencia’ ROLLBACK;
Desencadenadores CLR Requiere las siguientes acciones: Definir el desencadenador como una clase en lenguaje de .NET. Registrar el  ensamblado  (assemby) en SQL Server referenciando a aquél creado en el CLR. Crear el desencadenador haciendo referencia al ensamblado, clase y método.
Los desencadenadores CLR pueden tener acceso a las tablas  INSERTED  y  DELETED  a través de un objeto propio el  SqlCommand,  del objeto  SqlContext. sqlCommand  sqlCom = SqlContext.GetCommand() sqlComm.CommandText = “SELECT column_1 from INSERTED”;
La información de los eventos que disparan el desencadenador quedará disponible en la propiedad  EventData  del objeto  SqlTriggerContext.  Esta propiedad contiene un valor en formato XML que tiene: Hora del evento. Identificación del proceso o de la conexión a partir de lo cuáles se disparó el evento. Tipo de evento que disparó el desencadenador.
Creación de desencadenadores DDL y DML Antes de crear un desencadenador, se debe tener en cuenta: La sentencia  CREATE TRIGGER  debe ser la primera en la secuencia de comandos T-SQL.  Los permisos de creación de desencadenador son los de la tabla sobre la cual se está creando el desencadenador. Los desencadenadores DML son objetos de la base de datos y deben seguir las reglas de identificación de objetos. Sólo se pueden crear desencadenadores en la base de datos en la que está posicionado. No se pueden crear desencadenadores sobre tablas temporarias o las tablas de sistema.  Los desencadenadores  INSTEAD OF DELETE  e  INSTEAD OF UPDATE  no pueden crearse en tablas que tienen definidas claves foráneas con acciones de  UPDATE  o  DELETE . Los desencadenadores definidos para  DELETE  no se dispararán.
Creación de desencadenadores Para crear un desencadenador, se debe indicar: El nombre. La tabla sobre la cual ha de crearse. Cuánto se ha de disparar. Las sentencias que lo activan. Las sentencias de modificación de datos que lo componen.
Donde: Esquema Nombre Tabla/vista DATABASE ALL SERVER WITH ENCRYPTION EXECUTE AS AFTER INSTEAD OF DELETE] [,] [INSERT][,] [UPDATE]} Tipo _ evento Grupo _ evento WITH APPEND NOT FOR REPLICATION AS Sentencia_sql Especificador_de_metodo
Funciones UPDATE() y COLUMNS_UPDATE() Se puede utilizar la función  UPDATE()  para determinar si una sentencia  INSERT  o  UPDATE  afectó una columna específica de una tabla. La función devuelve trae o  FALSE. COLUMNS_UPDATE Permite evaluar varias columnas al mismo tiempo, devolviendo un patrón de bytes por las columnas modificadas (por inserción o actualización). El patrón devuelto es del tipo varbinary, y para verificar este patrón, es necesario utilizar operadores binarios y una máscara.
Anular la acción de un desencadenador No es lo mismo ejecutar un  ROLLBACK  en un  desencadenador que en una transacción normal dentro de un procedimiento almacenado. Documentar los desencadenadores Excepto en los casos de los desencadenadores encriptados, donde conviene documentar el código, se recomienda mantener al menos un gráfico de interacción entre desencadenadores y tablas afectadas, ya que puede resultar muy difícil entender el funcionamiento del modelo de datos.
Ejemplo de documentación de desencadenadores. NominaSalarial Retenciones Programador O usuario Perfiles PRC_ACTUALIZARSALARIO TRG_IU_ACTUALIZARRETENCIONES TRG_IU_ACTUALIZARRETENCIONES
Deshabilitar desencadenadores Para eliminar un desencadenador, se debe ejecutar la sentencia: DISABLE TRIGGER [esquema . ] nombre ON { nombre_objeto| DATABASE | SERVER } [ : ] Eliminar desencadenadores   Con el objeto de eliminar un desencadenador, se debe ejecutar: Para el caso de los desencadenadores DML: DROP  TRIGGER  esquema.nombre  [ ,…n ]  [  ;  ] Para el caso de los desencadenadores DDL: DROP  TRIGGER  nombre  [ ,…n ] ON  {  DATABASE  |  ALL SERVER  } [  ;  ]
Modificar desencadenadores Al igual que los procedimientos almacenados, la modificación de desencadenador exige la sentencia  ALTER  y la reescritura de toda su definición. Desencadenadores anidados y recursivos Se considera que un desencadenador está anidado cuando es disparado por acción de otro desencadenador. Los desencadenadores pueden anidarse hasta 32 niveles y su configuración puede modificarse por medio de la opción de configuración de servidor  nested Triggers.
Existen dos tipos de recursividad: Recursividad directa Recursividad indirecta La opción de configuración de base de datos  RECURSIVE_TRIGGERS  sólo previene contra la recursividad directa cuando está fijada en  OFF . Los desencadenadores  INSTEAD OF no son contemplados  por esta opción.  NOTA:   Los desencadenadores son ideales para utilizar en situaciones en las que las restricciones no cumplen con una necesidad funcional.

TRIGGERS

  • 1.
    EQUIPO 9 FRAGOSOPEÑA FERNANDO HUERTA GÓMEZ DANIEL PÉREZ OCHOA VALERI PÉREZ SAN JUAN ALDO PAILLES RUBIÑOS FRANCISCO NICOLÁS TRIGGERS
  • 2.
    TRIGGERS Los Triggers(desencadenadores), es un mecanismo primario que provee SQL Server, y consiste en una especialización de los procedimientos almacenados que se activa cuando se ejecutan sentencias que modifican los datos o sus estructuras de alguna manera. DML DDL
  • 3.
    Desencadenadores DMLAplicar cambios en cascada sobre las tablas. Evitar sentencias maliciosas de INSERT, UPDATE y DELETE. Llevar auditor ía en tablas al efecto, de los cambios realizados en la base de datos. Evaluar el estado de una tabla antes y después de los cambios. Mantener actualizadas tablas totalizadoras. Mantener actualizados campos calculados. Tipos de desencadenadores DML: AFTER INSTEAD OF .NET
  • 4.
    Comparación de desencadenadores AFTER e INSTEAD OF FUNCIÓN AFTER INSTED OF Uso Tablas Tablas y vistas Cantidad por tabla o vista Múltiple por acción de INSERT, UPDATE o DELETE. Uno por acción de INSERT, UPDATE o DELETE. Acción en cascada No tiene restricciones. INSTED OF UPDATE y DELETE no están Permitidos en tablas que son destino de Acciones de integridad referencial en cascada. Ejecución Después: Proceso de restricciones. Acciones de integridad referencial declarativa. Creación de tablas inserted y deleted. Acción del trigger. Creación de tablas inserted y deleted. Antes: Proceso de restricciones. En lugar de: Acción del desencadenador. Orden de ejecución Se debe especificar orden. No aplicable. Referencias a columnas varchar(MAX), nvarchar(MAX), Y varbinary(MAX) en tablas Inserted y deleted. Permitida. Permitida. Referencias a columnas text, Ntext e image en tablas Inserted y deleted. No permitida. Permitida.
  • 5.
    Existen dos tablasespeciales que intervienen en los desencadenadores: Inserted Deleted La tabla deleted almacena copia de las filas afectadas durante la ejecución de sentencias UPDATE o DELETE La tabla inserted también almacena las filas afectadas, pero durante la ejecución de sentencias INSERT o UPDATE. Ambas son creadas y administradas en forma automática por SQL Server con el objeto de mantener los datos intermedios durante el proceso de un desencadenador.
  • 6.
    Estas tablas sepueden utilizar para: Extender la integridad referencial entre tablas. Insertar o modificar datos en las tablas de base de vista. Controlar errores y tomar acción. Hallar la diferencia entre estados entre la tabla original y los cambios producidos.
  • 7.
    Desencadenadores DDL Losdesencadenadores DDL, pueden tener alcance de base de datos o de servidor (reaccionan ante ciertos eventos disparados en ambos ámbitos). CREATE TRIGGER TRG_TBLAdvertencia ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS PRINT ‘Debe deshabilitar el desencadenador TRG_IUD_AUDIT para ejecutar esta sentencia’ ROLLBACK;
  • 8.
    Desencadenadores CLR Requierelas siguientes acciones: Definir el desencadenador como una clase en lenguaje de .NET. Registrar el ensamblado (assemby) en SQL Server referenciando a aquél creado en el CLR. Crear el desencadenador haciendo referencia al ensamblado, clase y método.
  • 9.
    Los desencadenadores CLRpueden tener acceso a las tablas INSERTED y DELETED a través de un objeto propio el SqlCommand, del objeto SqlContext. sqlCommand sqlCom = SqlContext.GetCommand() sqlComm.CommandText = “SELECT column_1 from INSERTED”;
  • 10.
    La información delos eventos que disparan el desencadenador quedará disponible en la propiedad EventData del objeto SqlTriggerContext. Esta propiedad contiene un valor en formato XML que tiene: Hora del evento. Identificación del proceso o de la conexión a partir de lo cuáles se disparó el evento. Tipo de evento que disparó el desencadenador.
  • 11.
    Creación de desencadenadoresDDL y DML Antes de crear un desencadenador, se debe tener en cuenta: La sentencia CREATE TRIGGER debe ser la primera en la secuencia de comandos T-SQL. Los permisos de creación de desencadenador son los de la tabla sobre la cual se está creando el desencadenador. Los desencadenadores DML son objetos de la base de datos y deben seguir las reglas de identificación de objetos. Sólo se pueden crear desencadenadores en la base de datos en la que está posicionado. No se pueden crear desencadenadores sobre tablas temporarias o las tablas de sistema. Los desencadenadores INSTEAD OF DELETE e INSTEAD OF UPDATE no pueden crearse en tablas que tienen definidas claves foráneas con acciones de UPDATE o DELETE . Los desencadenadores definidos para DELETE no se dispararán.
  • 12.
    Creación de desencadenadoresPara crear un desencadenador, se debe indicar: El nombre. La tabla sobre la cual ha de crearse. Cuánto se ha de disparar. Las sentencias que lo activan. Las sentencias de modificación de datos que lo componen.
  • 13.
    Donde: Esquema NombreTabla/vista DATABASE ALL SERVER WITH ENCRYPTION EXECUTE AS AFTER INSTEAD OF DELETE] [,] [INSERT][,] [UPDATE]} Tipo _ evento Grupo _ evento WITH APPEND NOT FOR REPLICATION AS Sentencia_sql Especificador_de_metodo
  • 14.
    Funciones UPDATE() yCOLUMNS_UPDATE() Se puede utilizar la función UPDATE() para determinar si una sentencia INSERT o UPDATE afectó una columna específica de una tabla. La función devuelve trae o FALSE. COLUMNS_UPDATE Permite evaluar varias columnas al mismo tiempo, devolviendo un patrón de bytes por las columnas modificadas (por inserción o actualización). El patrón devuelto es del tipo varbinary, y para verificar este patrón, es necesario utilizar operadores binarios y una máscara.
  • 15.
    Anular la acciónde un desencadenador No es lo mismo ejecutar un ROLLBACK en un desencadenador que en una transacción normal dentro de un procedimiento almacenado. Documentar los desencadenadores Excepto en los casos de los desencadenadores encriptados, donde conviene documentar el código, se recomienda mantener al menos un gráfico de interacción entre desencadenadores y tablas afectadas, ya que puede resultar muy difícil entender el funcionamiento del modelo de datos.
  • 16.
    Ejemplo de documentaciónde desencadenadores. NominaSalarial Retenciones Programador O usuario Perfiles PRC_ACTUALIZARSALARIO TRG_IU_ACTUALIZARRETENCIONES TRG_IU_ACTUALIZARRETENCIONES
  • 17.
    Deshabilitar desencadenadores Paraeliminar un desencadenador, se debe ejecutar la sentencia: DISABLE TRIGGER [esquema . ] nombre ON { nombre_objeto| DATABASE | SERVER } [ : ] Eliminar desencadenadores Con el objeto de eliminar un desencadenador, se debe ejecutar: Para el caso de los desencadenadores DML: DROP TRIGGER esquema.nombre [ ,…n ] [ ; ] Para el caso de los desencadenadores DDL: DROP TRIGGER nombre [ ,…n ] ON { DATABASE | ALL SERVER } [ ; ]
  • 18.
    Modificar desencadenadores Aligual que los procedimientos almacenados, la modificación de desencadenador exige la sentencia ALTER y la reescritura de toda su definición. Desencadenadores anidados y recursivos Se considera que un desencadenador está anidado cuando es disparado por acción de otro desencadenador. Los desencadenadores pueden anidarse hasta 32 niveles y su configuración puede modificarse por medio de la opción de configuración de servidor nested Triggers.
  • 19.
    Existen dos tiposde recursividad: Recursividad directa Recursividad indirecta La opción de configuración de base de datos RECURSIVE_TRIGGERS sólo previene contra la recursividad directa cuando está fijada en OFF . Los desencadenadores INSTEAD OF no son contemplados por esta opción. NOTA: Los desencadenadores son ideales para utilizar en situaciones en las que las restricciones no cumplen con una necesidad funcional.