UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEM LABORATORIO DE BES DE DATOS 1 Prof. Marco Aedo Práctica de Laboratorio Nº 6 I. OBJETIVOS ÍNDICES Y VIST Comprender la utilidad de los índices y su implementación Comprender el uso de las vistas y su implementación II. MARCO TEÓRICO 1. Definición El índice de un libro nos permite localizar información de una manera rápida sin la necesidad de hacer una búsqueda intensiva por todas las páginas del libro. El índice es una estructura adicional al contenido del libro en que se encuentran ordenados los temas del mismo, junto con un número que indica la página exacta en que se encuentra cada uno de ellos. Por supuesto, la información contenida en el libro es la misma con índice o sin él. El índice sólo influye en la velocidad con que se encuentra la información buscada. En el mundo de las bases de datos relacionales, los índices son estructuras que se pueden crear asociadas a tablas con el objetivo de acelerar algunas sentencias SQL ejecutadas sobre ellas. La ausencia o presencia de un índice asociado a una tabla no influye en la sintaxis de las sentencias SQL ejecutadas sobre esa tabla. SQLServer hace uso de los índices para incrementar el rendimiento cuando: - Busca registros con valores específicos en columnas indexadas. - Accede a una tabla en el orden de las columnas del índice. 2. Selección De Índices Los índices son creados para aumentar la eficiencia en los accesos a las tablas de la base de datos. A cambio se paga con el espacio extra ocupado por los índices y el tiempo necesario para mantenerlos. Aunque los índices agilizan la recuperación de los datos de las tablas, sin embargo ralentizan las actualizaciones y ocupan espacio en disco, ya que, cuando se realizan actualizaciones de una tabla de la base de datos, cada uno de los índices basados en esa tabla necesita también una actualización. Antes de crear un índice se debe determinar si es necesario, es decir, se debe estimar si el beneficio en el rendimiento que se obtendrá supera al costo derivado de su mantenimiento. El usuario sólo debe crear aquellos índices que considere necesarios y SQL Server se encargará de usarlos y mantenerlos automáticamente. El mantenimiento implica la modificación necesaria
del índice cuando se añaden, modifican o eliminan registros de la tabla. Por tanto, es importante utilizar los índices que se necesiten realmente y se deben borrar si no van a necesitarse de nuevo. 3. Creación de Índices Para la creación de índices usaremos la sentencia CREATE INDEX cuya sintaxis básica es: CREATE INDEX nombre_del_índice ON tabla(campo[c DESC],...) Por ejemplo, si queremos acelerar las consultas cuando busquemos a un proveedor por su nombre, podemos crear un índice asociado al campo nompro de la tabla proveedor. CREATE INDEX indice_proveedores ON proveedor(nompro) Cuando se crea una tabla es mejor insertar los registros antes de crear el índice. Si se crea antes el índice, SQLServer deberá actualizarlo cada vez que se inserte un registro. 4. Índices compuestos Un índice compuesto es aquél creado sobre más de un campo de la tabla. Los índices compuestos pueden acelerar la recuperación de información cuando la condición de la consulta correspondiente referencia a todos los campos indexados o sólo a los primeros. Por tanto, el orden de las columnas usado en la definición del índice es importante; generalmente, los campos por los que se accede con mayor frecuencia se colocan antes en la creación de índices. Supongamos que tenemos una tabla Libros con los campos: código, título, autor, editorial y género y creamos un índice compuesto sobre los campos género, título y editorial: CREATE INDEX indicelibros ON libros (genero, titulo, editorial) Dicho índice acelerará la recuperación de información de las consultas cuya condición incluya referencias al campo género, a los campos género y título o a los campos género, título y editorial Por ejemplo: SELECT codigo FROM libros WHERE genero= Novela AND titulo= Sin noticias de Gurb SELECT codigo FROM libros WHERE genero= Novela AND titulo= Sin noticias de Gurb AND editorial= Planeta Sin embargo no mejorará el acceso cuando las consultas no incluyan referencias a los primero campos del índice. Por ejemplo: SELECT codigo FROM libros WHERE titulo= Sin noticias de Gurb ; SELECT codigo FROM libros WHERE genero= Novela AND editorial= Planeta 5. Estructura de los índices Cuando se crea un índice, SQL Server recupera los campos indexados de la tabla y los ordena. A continuación almacena en una estructura especial los valores de los campos indexados junto con un identificador (ROWID) del registro correspondiente. Por lo general se usan árboles B* balaceados para igualar el tiempo necesario para acceder a
cualquier fila. 6. Eliminación de Índices Son varias las razones por las que puede interesar elimina un índice: - El índice no se necesitará más. - Por las características de la tabla el índice no mejora la eficiencia. - Necesitamos cambiar los campos que se indexan. - Necesitamos rehacer un índice muy fragmentado. Para eliminar un índice usaremos la sentencia: DROP INDEX nombre_del_índice Ejemplo: DROP INDEX Proveedor.indice_proveedores Se debe tener en cuenta que cuando se borra una tabla también se borran todos los índices asociados. ACTIVIDADES 1. Crearemos el fichero crear_tabla_libros con la siguiente información: create table libros( codigo varchar(8) constraint codigolibro_no_nulo not null constraint codigolibro_clave_primaria primary key, titulo varchar(40) constraint titulo_libro_no_nulo not null, autor varchar(30) constraint autor_libro_no_nulo not null, editorial varchar(20) constraint editorial_libro_no_nulo not null, genero varchar(15) ) Como resultado de la ejecución de este fichero se crea la tabla libros definiendo codigo como llave primaria. Name Null? Type ----------------------------------------- -------- --------------------- CODIGO NOT NULL VARCHAR(5) TITULO NOT NULL VARCHAR(40) AUTOR NOT NULL VARCHAR(30) EDITORIAL NOT NULL VARCHAR(20) GENERO VARCHAR(15) 2. Encontrar el código del libro, el título del libro y el nombre del autor que imprime la editorial Diksiyo. (Darse cuenta del tiempo que toma el SGBD para encontrar tal nombre de editorial) SELECT codigo, titulo, autor, editorial FROM libros where editorial= Diksiyo 3. Crear un índice para que acelere las consultas cuando se busque a una editorial por su nombre. CREATE INDEX indice_editoriales ON libros(editorial) 4. Volver a realizar el paso Nro. 2. (Darse cuenta del tiempo que toma el SGBD para encontrar tal nombre de editorial, teniendo en cuenta que se ha creado un índice para tal campo) 5. Crear un índice compuesto para acelerar la recuperación de información de las consultas cuya condición incluya referencias el campo género, a los campos género y título o a los campos género, título y editorial
CREATE INDEX indicelibros ON libros (genero, titulo, editorial) 6. Encontrar el código y nombre del libro Muerte sin sombra : (Darse cuenta del tiempo que toma el SGBD para encontrar este título del libro) SELECT codigo, titulo FROM libros WHERE titulo= Muerte sin sombra 7. Encontrar el código y nombre de la novela Muerte sin sombra : (Darse cuenta del tiempo que toma el SGBD para encontrar este título del libro) SELECT codigo, titulo FROM libros WHERE genero= Novela AND titulo= Muerte sin sombra 8. Encontrar todas las novelas de la editorial Cornucopia : SELECT * FROM libros WHERE genero= Novela AND editorial= Cornucopia 9. Encontrar la novelas de la editorial Cornucopia titulada Muerte sin sombra SELECT * FROM libros WHERE genero= Novela AND titulo= Muerte sin sombra AND editorial= Cornucopia III. MARCO TEÓRICO 1. Definición VIST Una vista es una tabla lógica cuya información se deriva de una tabla, de un conjunto de ellas o bien de otras vistas de la base de datos. Si el contenido de las tablas cambia, este cambio se ve reflejado en las vistas. Dicho de otra forma: es una expresión que describe una tabla sin crearla (a veces se le llama tabla virtual). Una vista no contiene ningún dato, en lugar de ello ésta es definida sobre una o más tablas base. Se puede usar vistas para: - Seleccionar un subconjunto de registros de una tabla base. - Incluir únicamente un subconjunto de las columnas de una tabla base. - Juntar registros relacionados de múltiples tablas base. - Combinar subconjuntos de registros de múltiples tablas usando la operación de unión. 2. Creación de Vistas Para la creación de vistas usaremos la sentencia CREATE VIEW cuya sintaxis básica es: CREATE VIEW nombre_de_la_índice Consulta_SQL; Supongamos la vista VentasParis, que representa el conjunto de suministros realizados sólo con integrantes procedentes de Paris. CREATE VIEW VentasParis SELECT ventas.codpro,codp,ventas.codpj,cantidad FROM proveedor,pieza,proyecto,ventas WHERE proveedor.ciudad='paris' AND pieza.ciudad='paris' AND proyecto.ciudad='paris' AND proveedor.codpro=ventas.codpro AND pieza.codpie=ventas.codp AND proyecto.codpj=ventas.codpj En la cláusula se especifica la consulta que determina qué filas y columnas de la tabla o tablas almacenadas forman parte de la vista.
3. Consulta de Vistas Se trata las vistas como una tabla cualquiera. Así por ejemplo, podemos consultar la relación VentasParis y de ella mostrar los códigos de proveedores que suministran al proyecto J3. SELECT DISTINCT codpro FROM VentasParis WHERE codpj='j3' 4. Modificación de Vistas Se pueden usar los comandos DELETE, INSERT, UPDATE sólo en determinadas ocasiones, la razón es que puesto que la vista no existe como tabla base (tabla almacenada), para el caso de insertar una nueva tupla, la cuestión es dónde encajaría esa tupla. En otros casos se plantea como habría que completar algunos atributos de la tuplas. Por ejemplo supongamos la vista siguiente: CREATE VIEW PiezasParis SELECT codpie,nompie,color,peso FROM pieza WHERE pieza.ciudad= Paris Si hacemos una inserción del tipo: INSERT INTO PiezasParis VALUES ( P8, Pieza ocho, Rojo,10) La vista PiezaParis cumple las condiciones para actualizar la tabla piezas, pero inserta NULL como valor para ciudad. Bastaría con añadir un campo más en la inserción con el valor Paris pero el atributo ciudad no pertenece a la vista. Por tanto habría que redefinir la vista para que incluyera ciudad. La sentencia para borrar una vista es: DROP VIEW Nombre_vista Para eliminar la vista de nuestro ejemplo, la sentencia sería: DROP VIEW VentasParis 5. Re Creación de Vistas Se puede cambiar la definición de una vista, con la sentencia ALTER VIEW. ALTER VIEW PiezasParis SELECT codpie codigo,nompie Nombre,color,peso FROM pieza WHERE pieza.ciudad= Paris La sintaxis de usar ALTER VIEW es la misma de CREATE VIEW. La ventaja para usar ALTER VIEW (en lugar de borrar la vista y crearla de nuevo) es que los procedimientos almacenados, triggers y permisos que referencia la vista no son afectados. 6. El Catálogo SQL y la información del esquema Cada SQL Server tiene un conjunto de tablas del sistema que almacena información descriptiva sobre las estructuras de las tablas, vistas, y otros objetos de la BD. Las tablas tienen el prefijo sys. Se puede acceder a estas tablas directamente, sin embargo, para muchos propósitos, es mejor acceder a la información a través de sus vistas. Por ejemplo, la siguiente consulta producirá una lista de todas las tablas y vistas accesibles en la base de datos: SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEM LABORATORIO DE BES DE DATOS 1 Prof. Marco Aedo Práctica de Laboratorio Nº 7 I. OBJETIVOS PROCEDIMIENTOS ALMACENADOS Y TRIGGERS II. Comprender el uso de los procedimientos almacenados y su implementación Comprender el uso de los triggers y su implementación MARCO TEÓRICO 1. Definición Procedimientos Almacenados (Stored Procedures o SP) Un procedimiento almacenado es creado con la sentencia CREATE PROCEDURE y es ejecutado con la sentencia EXECUTE (o una función de una interfaz de BD, como OLE DB). Se puede usar cualquier cantidad de sentencias SQL en un procedimiento almacenado, excepto las siguientes: CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER y CREATE VIEW. Un procedimiento almacenado trabaja como un procedimiento en un lenguaje de alto nivel, y puede tener parámetros de entrada y salida, variables locales, asignaciones, operaciones con la DB (DML y DDL), etc. 2. Creación de Procedimientos Almacenados CREATE PROCEDURE ListarPiezasConPesoMayorA @Peso Dec (5,2) SELECT * FROM pieza WHERE peso > @Peso Un procedimiento almacenado es siempre creado en la base de datos actual. Para ejecutar este procedimiento, se puede usar la sentencia: EXECUTE ListarPiezasConPesoMayorA 0 La palabra EXECUTE es opcional si el procedimiento almacenado es la única o la primera sentencia en un lote (batch) de sentencias. 3. Modificando SP La sentencia ALTER PROCEDURE nos permite cambiar el código del procedimiento almacenado sin cambiar los permisos que han sido otorgados al procedimiento. ALTER PROCEDURE tiene una sintaxis similar a la sentencia CREATE PROCEDURE. El siguiente ejemplo muestra como se podría modificar el procedimiento anteriormente creado: ALTER PROCEDURE ListarPiezasConPesoMayorA @Peso Dec (5,2) SELECT * FROM pieza
WHERE Ciudad IS NOT NULL AND peso >= @Peso Ahora ejecutemos la sentencia: EXECUTE ListarPiezasConPesoMayorA 0 Se puede renombrar un procedimiento almacenado con el procedimiento almacenado del sistema sp_rename, el cual toma tres argumentos: el nombre antiguo, el nuevo nombre y el tipo de objeto ( object es el tipo de objeto para el procedimiento almacenado, y es opcional). El siguiente ejemplo renombra el procedimiento ListarPiezasConPesoMayorA: sp_rename ListarPiezasConPesoMayorA, ListarTodasLasPiezasConPesoMayorA EXECUTE ListarTodasLasPiezasConPesoMayorA 0 4. Eliminando SP Puedes borrar un procedimiento almacenado con la sentencia DROP PROCEDURE: DROP PROCEDURE ListarTodasLasPiezasConPesoMayorA 5. Mostrando información sobre procedimientos almacenados Tres procedimientos almacenados del sistema muestran información sobre procedimientos almacenados: - sp_help nombre_del_procedimiento: Muestra el propietario del procedimiento y cuando fue creado. sp_help ListarPiezasConPesoMayorA - sp_helptext nombre_del_procedimiento: Muestra el código para el procedimiento. sp_helptext ListarPiezasConPesoMayorA - sp_depends nombre_del_procedimiento: Muestra una lista de objetos a los cuales hace referencia el procedimiento sp_depends ListarPiezasConPesoMayorA_ 6. Parámetros sobre SP Un procedimiento almacenado puede tener hasta 1024 parámetros. Cada declaración de parámetro tiene la siguiente forma básica: @nombre_del_parametro tipo_de_dato Un nombre de parámetro empieza con @, y los siguientes caracteres pueden ser letras unicode, dígitos, o los símbolos @, $, # o _. No se podría empezar un parámetro con el nombre @@ ya que SQLServer usa esta notación para algunas funciones. Se puede definir un valor de entrada por defecto a ser usado si ningún argumento es otorgado cuando el procedimiento es llamado. En el ejemplo anterior podemos modificarlo para dar un valor por defecto que podría seleccionar una pieza con peso mayor que cero: CREATE PROCEDURE ListarPiezasConPesoMayorA @Peso Dec (5,2) = 0.001 SELECT * FROM pieza WHERE peso > @Peso
Con esta definición se puede llama al procedimiento simplemente usando la siguiente sentencia, lo cual es equivalente a llamar al procedimiento con 0.001 como argumento: EXECUTE ListarPiezasConPesoMayorA Todos los parámetros pueden servir como parámetros de entrada. Para usar un parámetro como uno de salida, adicionemos la palabra clave Output a su declaración (después del valor por defecto, si es que lo tiene), como se muestra a continuación: CREATE PROCEDURE ConseguirPesoDePieza @CodigoPieza varchar(3), @PesoPieza Dec (5,2) Output Set @PesoPieza = (SELECT peso FROM pieza WHERE codpie = @CodigoPieza ) Cuando se llama a un procedimiento que tiene un parámetro de salida, se DEBE dar una variable para el argumento y usar la palabra clave Output después del argumento en la sentencia EXECUTE. declare @PesoDeLaPieza dec(5,2) EXECUTE ConseguirPesoDePieza P4, @PesoDeLaPieza Output Una manera alternativa para especificar argumentos cuando se llama a procedimientos almacenados es usar el nombre del parámetro correspondiente como es definido en el procedimiento. Veamos: declare @PesoDeLaPieza dec(5,2) EXECUTE ConseguirPesoDePieza 7. Retornando un conjunto como resultado @CodigoPieza = P4, @PesoPieza = @PesoDeLaPieza Output Un procedimiento almacenado retorna un conjunto para cada sentencia SELECT ejecutada que no es usada como una subconsulta (es decir, en lugar de un valor simple) y que no están asignadas todas las columnas en la consulta a variables o parámetros. Por ejemplo el siguiente procedimiento retorna dos conjuntos de resultados. CREATE PROCEDURE ListarVentasBajasYAltas SELECT * FROM ventas WHERE cantidad<100 SELECT * FROM ventas WHERE cantidad>1000 Veamos el resultado de ejecutar: EXECUTE ListarVentasBajasYAltas TRIGGERS
I. MARCO TEÓRICO 1. Definición Los dos principales mecanismos que ofrece Microsoft SQL Server 2000 para exigir las reglas de empresa y la integridad de datos son: las restricciones y los desencadenadores. Un desencadenador es un procedimiento almacenado de tipo especial que actúa automáticamente cuando se modifican los datos de la tabla. Los desencadenadores se invocan en respuesta a las instrucciones INSERT, UPDATE y DELETE. Un desencadenador puede consultar otras tablas e incluir instrucciones de Transact-SQL complejas. El desencadenador y la instrucción que lo activa se tratan como una sola transacción que puede deshacerse desde el desencadenador. Si se detecta un error grave (por ejemplo, no hay suficiente espacio en disco), se deshace automáticamente toda la transacción. Los desencadenadores tienen varias utilidades: Los desencadenadores pueden realizar cambios en cascada por medio de tablas relacionadas de la base de datos; sin embargo, estos cambios pueden ejecutarse de manera más eficaz mediante restricciones de integridad referencial en cascada. Los desencadenadores pueden exigir restricciones más complejas que las restricciones CHECK. A diferencia de éstas, los desencadenadores pueden hacer referencia a columnas de otras tablas. Por ejemplo, un desencadenador puede utilizar una instrucción SELECT de otra tabla para comparar con los datos insertados o actualizados y para realizar acciones adicionales, como modificar los datos o mostrar un mensaje de error definido por el usuario. Los desencadenadores también pueden evaluar el estado de una tabla antes y después de realizar una modificación de datos y actuar en función de la diferencia. Varios desencadenadores del mismo tipo (INSERT, UPDATE o DELETE) en una tabla permiten realizar distintas acciones en respuesta a una misma instrucción de modificación. 2. Detalles Un trigger es un tipo especial de procedimientos almacenados que es ejecutado automáticamente cuando una sentencia INSERT, UPDATE, o DELETE actualiza uno o más registros en una tabla. SQL Server llama a un trigger para cada operación especificada sobre una tabla en particular. Generalmente los triggers son asociados con tablas base (no vistas), sin embargo, existe una clase especial de trigger, que usa además vistas. Los triggers son siempre invocados por SQL Server, no se puede usar la sentencia EXECUTE para llamar a un trigger. Los triggers también no tienen parámetros y no retornan valor. 3. Creación de triggers Primero debemos de crear una tabla base en la que se guarde una bitácora de acciones sobre piezas: CREATE TABLE BitacoraDePiezas( codpie varchar(3), accion varchar(30), usuario varchar(20), fecha datetime ) Se puede crear un trigger usando la sentencia CREATE TRIGGER como se muestra a continuación. CREATE TRIGGER ActualizacionDePieza
ON pieza FOR update INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Update, Current_User, Current_TimeStamp FROM Inserted SELECT * FROM pieza SELECT * FROM BitacoraDePiezas SELECT * FROM Inserted SELECT * FROM deleted Este ejemplo muestra los elementos esenciales de una definición de un trigger. El nombre del trigger es el que aparece después de la palabra clave CREATE TRIGGER. La cláusula ON especifica una simple tabla base con la que está asociada el trigger. La cláusula FOR especifica para qué acción se ejecutará el trigger; se puede usar una o más palabras claves como INSERT, UPDATE o DELETE (como sinónimo a FOR se puede usar AFTER). Después de la cláusula se puede codificar un procedimiento almacenado. Una vez que este ejemplo es creado, SQL Server automáticamente invoca al procedimiento almacenado del trigger cada vez que una actualización sobre la tabla pieza es realizada. En este ejemplo, el trigger consiste de un simple INSERT y adiciona registros a la tabla BitacoraDePiezas. El valor de codpie de la tabla pieza es el nuevo valor insertado en la tabla BitacoraDePiezas. Las otras tres columnas mantienen un tipo de acción (que es update), el usuario que realizó la acción y la fecha y hora. Las tablas temporales Inserted y Deleted tienen la misma estructura de columnas como la tabla base sobre la cual el trigger es definido. Veamos como funciona el trigger, actualizando algunos registros: UPDATE pieza SET nompie= Tuerca ABC WHERE nompie= Tuerca Y luego UPDATE pieza SET nompie='clavo XYZ' WHERE nompie='clavo' AND peso>5 No es necesario crear la tabla: Inserted para usar el trigger. SQL Server maneja tablas residentes en memoria automáticamente usadas por triggers. También el registro de las operaciones de INSERT y DELETE sobre pieza pueden ser usados creando los siguientes dos triggers. CREATE TRIGGER InsercionDePieza ON pieza FOR insert INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Insert, Current_User, Current_TimeStamp FROM Inserted SELECT * FROM pieza SELECT * FROM BitacoraDePiezas SELECT * FROM Inserted SELECT * FROM deleted CREATE TRIGGER EliminacionDePieza ON pieza FOR delete INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha )
SELECT codpie, Delete, Current_User, Current_TimeStamp FROM Deleted SELECT * FROM pieza SELECT * FROM BitacoraDePiezas SELECT * FROM Inserted SELECT * FROM deleted Nótese que en este último trigger se usa el identificador Deleted que se refiere a la tabla residente en memoria que contiene todos los registros antiguos para la tabla. Veamos como funciona el trigger, insertando y borrando un registro: INSERT INTO pieza VALUES ( P50, Mi pieza, Naranja,30, Arequipa ) DELETE FROM pieza where codpie= P50 Ahora borremos nuestros triggers recientemente creados: DROP TRIGGER ActualizacionDePieza DROP TRIGGER InsercionDePieza DROP TRIGGER EliminacionDePieza Como una alternativa para crear un trigger para cada tipo de operación, se puede crear un simple trigger para las tres operaciones y usar algunas técnicas de programación para manejar cada tipo de operación apropiadamente. El siguiente ejemplo lista los tres tipos de sentencias en la cláusula FOR y usa sentencias de condición para insertar apropiadamente valores en la tabla BitacoraDePiezas: CREATE TRIGGER OperacionesSobrePieza ON pieza FOR insert, update, delete DECLARE @NumeroDeInserciones Int DECLARE @NumeroDeEliminaciones Int SET @NumeroDeInserciones = (SELECT COUNT(*) FROM Inserted ) SET @NumeroDeEliminaciones = (SELECT COUNT(*) FROM Deleted ) If ( @NumeroDeInserciones > 0 ) Begin INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Case When ( @NumeroDeEliminaciones > 0 ) Then Update Else Insert End, Current_User, Current_TimeStamp FROM Inserted End Else If ( @NumeroDeEliminaciones > 0 ) Begin INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Delete, Current_User, Current_TimeStamp FROM Deleted End En este ejemplo se puede ver que la tabla temporal Inserted tiene filas cada vez que una sentencia INSERT o UPDATE afecta una o más filas. Para la sentencia UPDATE, la tabla temporal Deleted tiene los valores de las filas antiguas y la tabla temporal Inserted tiene los nuevos valores de las filas. En este ejemplo también refleja otro importante aspecto de los triggers: Un trigger para una operación UPDATE o DELETE sobre una tabla es invocada si ninguna fila es afectada por la sentencia (porque ninguna fila satisface la cláusula Where).
INSERT INTO pieza VALUES ( P50, Otra pieza, Marron,50, Chile ) UPDATE pieza SET codpie= P96 WHERE codpie= P50 DELETE FROM pieza where codpie= P96 4. Verificando cambios para una columna específica Para un trigger INSERT o UPDATE es posible codificar si una columna es actualizada, usando el comando test: if update(nombre_de_clumna) en el cuerpo del trigger si la sentencia INSERT o UPDATE explícitamente lista una o más columnas en particular. El siguiente ejemplo muestra como usar este test: CREATE TRIGGER ActualizacionDeStatusDeProveedor ON proveedor FOR update If update( status ) INSERT into BitacoraDeStatusDeProveedor ( codpro, accion, status, usuario, fecha ) SELECT codpro, Update, status, Current_User, Current_TimeStamp FROM Inserted EndIf Para la ejecución correcta del trigger se necesita la siguiente tabla: CREATE TABLE BitacoraDeStatusDeProveedor ( codpro varchar(3), accion varchar(30), status numeric, usuario varchar(20), fecha datetime ) Ejecutemos las siguientes sentencias: select * from proveedor UPDATE proveedor SET nompro= Juan Reynoso WHERE ciudad= Lima SELECT * FROM BitacoraDeStatusDeProveedor UPDATE proveedor SET status=2 WHERE ciudad= Lima SELECT * FROM BitacoraDeStatusDeProveedor Con la función Columns_Update() se puede conocer que columnas son actualizadas para las sentencias INSERT o UPDATE. 5. Alterando y borrando triggers Para cambiar la definición de un trigger, se puede borrar y luego re-crearlo, o usar la sentencia ALTER TRIGGER. Para borrar un trigger, se usa la sentencia DROP TRIGGER: DROP TRIGGER ActualizacionDeStatusDeProveedor 6. Habilitando y deshabilitando triggers La sentencia ALTER TABLE permite habilitar y deshabilitar triggers: ALTER TABLE proveedor DISABLE TRIGGER ActualizacionDeStatusDeProveedor Operaciones: UPDATE proveedor SET status=2 WHERE ciudad= Lima SELECT * FROM BitacoraDeStatusDeProveedor 7. Mostrando información sobre triggers Cuatro procedimientos almacenados muestran información sobre estos: - sp_help nombre_trigger: Muestra el propietario y la fecha de creación del trigger. - sp_helptext nombre_trigger: Muestra el código para el trigger. - sp_helptrigger nombre_tabla: Muestra una listra de triggers definidos para una tabla. - sp_depends nombre_trigger: Muestra la lista de objetos a los cuales el trigger hace referencia.