Sunteți pe pagina 1din 16

Un disparador es una orden que el sistema ejecuta de manera automtica como

efecto secundario de la modificacin de la base de datos. Para disear un


mecanismo disparador hay que cumplir dos requisitos:

1. Especificar las condiciones en las que se va a ejecutar el disparador. Esto se


descompone en un evento que causa la comprobacin del disparador y una
condicin que se debe cumplir para ejecutar el disparador.

2. Especificar las acciones que se van a realizar


cuando se ejecute el disparador. Este modelo de disparadores se denomina
modelo evento-condicin-accin. La base de datos almacena disparadores
como si fuesen datos normales, por lo que son persistentes y accesibles para
todas las operaciones de la base de datos. Una vez se almacena un disparador en
la base de datos, el sistema de base de datos asume la responsabilidad de
ejecutarlo cada vez que ocurra el evento especificado y se satisfaga la condicin
correspondiente.

6.4.1. Necesidad de los disparadores


Los disparadores son mecanismos tiles para alertar a los usuarios o para realizar
de manera automtica ciertas tareas cuando se cumplen determinadas
condiciones.
Amodo de ejemplo supngase que, en lugar de permitir saldos de cuenta
negativos, el banco trata los descubiertos dejando a cero el saldo de las cuentas y
creando un prstamo por el importe del descubierto. Este prstamo recibe un
nmero de prstamo idntico al nmero de cuenta que ha tenido el descubierto.
Eneste ejemplo la condicin para ejecutar el disparador es una actualizacin de la
relacin cuenta que d lugar a un valor negativo de saldo. Supngase que Santos
retir
cierta cantidad de dinero de una cuenta que dio lugar a que el saldo de la cuenta
fuera negativo. t denota la tupla de la cuenta con un valor negativo de saldo. Las
acciones que hay que emprender son las siguientes:

Insertar una nueva tupla s a la relacin prstamo con


s[nombre-sucursal] = t[nombre-sucursal]
s[nmero-prstamo] = t[nmero-cuenta]
s[importe] = t[saldo]
(Obsrvese que, dado que t[saldo] es negativo, hay que cambiar el signo de
t[saldo] para obtener el importe del prstamo un nmero positivo).
Insertar una nueva tupla u a la relacin prestatario
Con
u[nombre-cliente] = Santos
u[nmero-prstamo] = t[nmero-cuenta]
Hacer que t[saldo] sea 0.
Como otro ejemplo del uso de disparadores, supngase un almacn que desee
mantener un inventario mnimo de cada producto; cuando el nivel de inventario de
un producto cae por debajo del nivel mnimo, se debera solicitar un pedido
automticamente. Para implementar con disparadores esta regla de negocio se
hara:
al modificar el nivel de inventario de un producto, el disparador debera comparar
el nivel con el mnimo y si el nivel es inferior al mnimo, se aadira un nuevo
pedido a la relacin pedido. Obsrvese que los sistemas de disparadores en
general
no pueden realizar actualizaciones fuera de la base de datos, y por lo tanto, en
este ltimo ejemplo, no se puede usar un disparador para realizar un pedido en el
mundo externo. En su lugar se aade un pedido a la relacin pedidos como en el
ejemplo del inventario. Se debe crear un proceso del sistema separado que se
est ejecutando constantemente que explore peridicamente la relacin pedidos y
solicite los pedidos. Este proceso del sistema anotara las tuplas de la relacin
pedidos que se han procesado y cundo se ha procesado cada pedido. El proceso
tambin llevara cuenta del despacho de pedidos y alertara a los gestores en caso
de condiciones excepcionales tales como retrasos en las entregas.

6.4.2. Disparadores en SQL

Los sistemas de bases de datos SQL usan ampliamente los disparadores, aunque
antes de SQL:1999 no fueron parte de la norma. Por desgracia, cada sistema de
bases de datos implement su propia sintaxis para los disparadores,
conduciendo a incompatibilidades. En la Figura 6.3 se describe la sintaxis
SQL:1999 para los disparadores (que es similar a la sintaxis de los sistemas de
bases de datos DB2 de IBM y de Oracle).
create trigger descubierto after update on cuenta
referencing new row as nfila
for each row
when nfila.saldo < 0
begin atomic
insert into prestatario
(select nombre-cliente, nmero-cuenta
from impositor
where nfila.nmero-cuenta = impositor.nmero-cuenta);
insert into prstamo values
(nfila.nmero-cuenta, nfila.nombre-sucursal, nfila.saldo)
update cuenta set saldo = 0
where cuenta.nmero-cuenta = nfila.nmero-cuenta
end

CREATE TRIGGER (Transact-SQL)


http://msdn.microsoft.com/es-sv/library/ms189799.aspx
Crea un disparador DML, DDL o de logon. Un disparador es una clase especial de
procedimiento almacenado que se ejecuta automticamente cuando se produce
un evento en el servidor de bases de datos. Los disparadores DML se ejecutan
cuando un usuario intenta modificar datos mediante un evento de lenguaje de
manipulacin de datos (DML). Los eventos DML son instrucciones INSERT,
UPDATE o DELETE de una tabla o vista. Estos desencadenadores se activan
cuando se desencadena cualquier evento vlido, con independencia de que las
filas de la tabla se vean o no afectadas. Para obtener ms informacin,
vea Desencadenadores DML.
Los disparadores DDL se ejecutan como respuesta a diversos eventos del
lenguaje de definicin de datos (DDL). Estos eventos corresponden principalmente
a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados
procedimientos almacenados del sistema que ejecutan operaciones de tipo
DDL. Los desencadenadores logon se activan en respuesta al evento LOGON que
se genera cuando se establece la sesin de un usuario. Los desencadenadores

pueden crearse directamente a partir de instrucciones de Transact-SQL o de


mtodos de ensamblados creados en Common Language Runtime (CLR) de
Microsoft .NET Framework y cargados en una instancia de SQL Server. SQL
Server permite crear varios desencadenadores para cualquier instruccin
especfica.

Sintaxis
-- SQL Server Syntax
Trigger on an INSERT, UPDATE, or DELETE statement to a table
or view (DML Trigger)
CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method
specifier [ ; ] > }
<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name
Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or
UPDATE STATISTICS statement (DDL Trigger)

Sintaxis
-- Windows Azure SQL Database Syntax
Trigger on an INSERT, UPDATE, or DELETE statement to a table
or view (DML Trigger)
CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS { sql_statement [ ; ] [ ,...n ] [ ; ] > }
<dml_trigger_option> ::=
[ EXECUTE AS Clause ]
-- Windows Azure SQL Database Syntax
Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or
UPDATE STATISTICS statement (DDL Trigger)
CREATE TRIGGER trigger_name
ON { DATABASE }
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS { sql_statement [ ; ] [ ,...n ] [ ; ] }
<ddl_trigger_option> ::=
[ EXECUTE AS Clause ]

CREATE TRIGGER trigger_name


ON { ALL SERVER | DATABASE }
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method
specifier > [ ; ] }
<ddl_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
Trigger on a LOGON event (Logon Trigger)
CREATE TRIGGER trigger_name
ON ALL SERVER
[ WITH <logon_trigger_option> [ ,...n ] ]
{ FOR| AFTER } LOGON
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method
specifier > [ ; ] }
<logon_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]

Argumentos
schema_name
Es el nombre del esquema al que pertenece un desencadenador DML. Los desencadenadores DML tienen como
mbito el esquema de la tabla o la vista donde se crean.schema_name no se puede especificar para los
desencadenadores DDL o LOGON.
trigger_name
Es el nombre del desencadenador. El parmetro trigger_name debe cumplir con las reglas de los identificadores,
con la excepcin de que trigger_name no puede comenzar con los smbolos # o ##.
table | view
Es la tabla o vista en que se ejecuta el desencadenador DML; algunas veces se denomina tabla del
desencadenador o vista del desencadenador. Especificar el nombre completo de la tabla o vista es opcional. Solo
se puede hacer referencia a una vista mediante un desencadenador INSTEAD OF. No es posible definir
desencadenadores DML en tablas temporales locales o globales.
DATABASE
Aplica el mbito de un desencadenador DDL a la base de datos actual. Si se especifica, el desencadenador se
activa cada vez que event_type o event_group tienen lugar en la base de datos actual.
ALL SERVER
Aplica el mbito de un desencadenador DDL o logon al servidor actual. Si se especifica, el desencadenador se
activa cada vez que event_type o event_group tienen lugar en el servidor actual.
WITH ENCRYPTION
Ofusca el texto de la instruccin CREATE TRIGGER. El uso de WITH ENCRYPTION impide que el
desencadenador se publique como parte de la replicacin de SQL Server.WITH ENCRYPTION no se puede
especificar para desencadenadores CLR.
EXECUTE AS
Especifica el contexto de seguridad en el que se ejecuta el desencadenador. Permite controlar qu cuenta de
usuario utiliza la instancia de SQL Server para validar los permisos sobre cualquier objeto de base de datos al
que haga referencia el desencadenador.
Para obtener ms informacin, vea EXECUTE AS (clusula de Transact-SQL).
FOR | AFTER
AFTER especifica que el desencadenador DML solo 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 solo se especifica la palabra clave FOR.
Los desencadenadores AFTER no se pueden definir en las vistas.
INSTEAD OF
Especifica que se ejecuta el desencadenador DML en vez de la instruccin SQL desencadenadora, por lo que se
suplantan las acciones de las instrucciones desencadenadoras. INSTEAD OF no se puede especificar para los
desencadenadores DDL o logon.
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 permiten en vistas actualizables que usan WITH CHECK
OPTION. SQL Server genera un error cuando se agrega un desencadenador INSTEAD OF a una vista
actualizable para la que se especific WITH CHECK OPTION. El usuario debe quitar esta opcin mediante
ALTER VIEW antes de definir el desencadenador INSTEAD OF.
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }

Especifica las instrucciones de modificacin de datos que activan el desencadenador DML 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. Tampoco se permite la opcin
UPDATE en tablas que tengan una relacin referencial que especifique una accin ON UPDATE en cascada.
WITH APPEND
Especifica que debe agregarse un desencadenador adicional de un tipo existente. WITH APPEND no se puede
utilizar con desencadenadores INSTEAD OF o cuando se ha declarado AFTER explcitamente. WITH
APPEND solo se puede utilizar si se especific FOR (sin INSTEAD OF ni AFTER) por motivos de
compatibilidad con versiones anteriores. WITH APPEND no se puede especificar si se ha especificado
EXTERNAL NAME (es decir, si el desencadenador es de tipo CLR).
event_type
Es el nombre de un evento de lenguaje Transact-SQL que, despus de su ejecucin, hace que se active un
desencadenador DDL. Los eventos vlidos para los desencadenadores DDL se enumeran en Eventos DDL.
event_group
Es el nombre de un agrupamiento predefinido de eventos de lenguaje de Transact-SQL. El desencadenador DDL
se activa tras la ejecucin de cualquier evento de lenguaje Transact-SQL que pertenezca a event_group. Los
grupos de eventos vlidos para los desencadenadores DDL se enumeran en Grupos de eventos DDL.
Una vez que CREATE TRIGGER ha terminado de ejecutarse, event_group acta tambin como una macro
agregando los tipos de evento que abarca a la vista de catlogo sys.trigger_events.
NOT FOR REPLICATION
Indica que el desencadenador no debe ejecutarse cuando un agente de replicacin modifica la tabla involucrada
en el mismo.
sql_statement
Son las condiciones y acciones del desencadenador. Las condiciones del desencadenador especifican los
criterios adicionales que determinan si los intentos de los eventos DML, DDL o logon hacen que se lleven a
cabo las acciones del desencadenador.
Las acciones del desencadenador especificadas en las instrucciones Transact-SQL surten efecto cuando se
intenta la operacin.
Los desencadenadores pueden incluir cualquier nmero y clase de instrucciones Transact-SQL, con
excepciones. Para obtener ms informacin, vea la seccin Notas. Un desencadenador est diseado para
comprobar o cambiar los datos en base a una instruccin de modificacin o definicin de datos; no debe
devolver datos al usuario.Las instrucciones Transact-SQL de un desencadenador incluyen a menudo lenguaje de
control de flujo.
Los desencadenadores DML usan las tablas lgicas (conceptuales) deleted e inserted. Son de estructura similar a
la tabla en que se define el desencadenador, es decir, la tabla en que se intenta la accin del usuario. Las tablas
deleted e inserted guardan los valores antiguos o nuevos de las filas que la accin del usuario puede
cambiar. Por ejemplo, para recuperar todos los valores de la tabla deleted, utilice:
SELECT * FROM deleted;
Para obtener ms informacin, vea Usar las tablas insertadas y eliminadas.
Los desencadenadores DDL y logon capturan informacin acerca del evento desencadenador mediante el uso de
la funcin EVENTDATA (Transact-SQL). Para obtener ms informacin, vea Usar la funcin EVENTDATA.
SQL Server permite actualizar las columnas text, ntext o image mediante el uso del desencadenador INSTEAD
OF en tablas o vistas.
< method_specifier >

En el caso de un desencadenador CLR, especifica el mtodo de enlace de un ensamblado con el


desencadenador. El mtodo no debe tomar argumentos y debe devolver void. class_name debe ser un
identificador vlido de SQL Server y debe existir como clase en el ensamblado con visibilidad de
ensamblado. Si la clase tiene un nombre calificado como espacio de nombres que utiliza '.' para separar las
partes del espacio de nombres, el nombre de la clase debe estar delimitado por delimitadores de tipo [ ] o " ". La
clase no puede ser anidada.

Ejemplos
A.Usar desencadenador DML con un mensaje de aviso
El siguiente desencadenador DML imprime un mensaje en el cliente cuando
alguien intenta agregar o cambiar datos en la tabla Customer de la base de datos
AdventureWorks2012.
IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL
DROP TRIGGER Sales.reminder1;
GO
CREATE TRIGGER reminder1
ON Sales.Customer
AFTER INSERT, UPDATE
AS RAISERROR ('Notify Customer Relations', 16, 10);
GO

B.Usar un desencadenador DML con un mensaje de correo electrnico de aviso


Este ejemplo enva un mensaje de correo electrnico a una persona especificada
(MaryM) cuando cambia la tabla Customer.
IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL

EXEC msdb.dbo.sp_send_dbmail

DROP TRIGGER Sales.reminder2;

@profile_name = 'AdventureWorks2012 Administrator',

GO

@recipients = 'danw@Adventure-Works.com',

CREATE TRIGGER reminder2


ON Sales.Customer

@body = 'Don''t forget to print a report for the sales


force.',

AFTER INSERT, UPDATE, DELETE


AS

@subject = 'Reminder';
GO

C.Usar un desencadenador DML AFTER para exigir una regla de negocios


entre las tablas PurchaseOrderHeader y Vendor
Debido a que las restricciones CHECK solo pueden hacer referencia a las
columnas en las que se han definido las restricciones de columna o de tabla,
cualquier restriccin entre tablas, en este caso, reglas de negocios, debe definirse
como desencadenadores.
En el ejemplo siguiente se crea un desencadenador DML en la base de datos
AdventureWorks2012. El desencadenador comprueba que la solvencia del
proveedor es satisfactoria cuando se intenta insertar un nuevo pedido de compra
en la tabla PurchaseOrderHeader. Para obtener la solvencia del proveedor, debe
hacerse referencia a la tabla Vendor. Si la solvencia no es satisfactoria, se obtiene
un mensaje y no se ejecuta la insercin.
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the
Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5
(below average).

CREATE
TRIGGER
Purchasing.LowCredit
Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
IF EXISTS (SELECT *
FROM Purchasing.PurchaseOrderHeader AS p

ON

JOIN inserted AS i
ON p.PurchaseOrderID = i.PurchaseOrderID
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = p.VendorID
WHERE v.CreditRating = 5
)
BEGIN
RAISERROR ('A vendor''s credit rating is too low to accept new
purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
GO
-- This statement attempts to insert a row into the
PurchaseOrderHeader table
-- for a vendor that has a below average credit rating.
-- The AFTER INSERT trigger is fired and the INSERT transaction
is rolled back.

INSERT
INTO
Purchasing.PurchaseOrderHeader
(RevisionNumber, Status, EmployeeID,
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal,
TaxAmt, Freight)
VALUES (
2
,3
,261
,1652
,4
,GETDATE()
,GETDATE()
,44594.55
,3567.564
,1114.8638 );
GO

D.Usar un desencadenador DDL con mbito de base de datos


En el ejemplo siguiente se usa un desencadenador DDL para impedir que se
quiten sinnimos de una base de datos.
IF EXISTS (SELECT * FROM sys.triggers
WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety
ON DATABASE;
GO
CREATE TRIGGER safety
ON DATABASE
FOR DROP_SYNONYM

AS
RAISERROR ('You must disable Trigger "safety" to drop
synonyms!',10, 1)
ROLLBACK
GO
DROP TRIGGER safety
ON DATABASE;
GO

E.Usar un desencadenador DDL con mbito de servidor


En el ejemplo siguiente se utiliza un desencadenador DDL para imprimir un
mensaje si se produce un evento CREATE DATABASE en la instancia actual del
servidor, y se utiliza la funcin EVENTDATA para recuperar el texto de la
instruccin Transact-SQL correspondiente. Para obtener ms ejemplos que usan
EVENTDATA en desencadenadores DDL, veaUsar la funcin EVENTDATA.
IF EXISTS (SELECT * FROM sys.server_triggers
WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS
PRINT 'Database Created.'
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO

F.Usar un desencadenador LOGON

El ejemplo siguiente de desencadenador logon rechaza un intento de iniciar sesin


en SQL Server como miembro del inicio de sesin login_test si ya hay tres
sesiones de usuario ejecutndose con ese inicio de sesin.
USE master;
GO
CREATE
LOGIN
login_test
WITH
PASSWORD
'3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
(SELECT COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND
original_login_name = 'login_test') > 3
ROLLBACK;
EN

G.Ver los eventos que hacen que se active un desencadenador


En el ejemplo siguiente se efecta una consulta en las vistas de
catlogo sys.triggers y sys.trigger_events para determinar qu eventos de
lenguaje Transact-SQL hacen que se active el desencadenador safety. safety se
ha creado en el ejemplo anterior.
SELECT TE.*
FROM sys.trigger_events AS TE
JOIN sys.triggers AS T ON T.object_id = TE.object_id
WHERE T.parent_class = 0 AND T.name = 'safety';
GO

Sintaxis y ejemplos de disparo


Para

crear

un

disparador

dejar

un

disparador,

utilice

el CREATE

TRIGGER o DROP TRIGGER declaracin, se describe en la Seccin 13.1.19,


"Sintaxis de CREATE TRIGGER" y Seccin , "Sintaxis DROP TRIGGER" .
Aqu est un ejemplo simple que asocia un disparador con una mesa, para activar
para INSERToperaciones. El disparador acta como un acumulador, la suma de
los valores insertados en una de las columnas de la tabla.
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Consulta Aceptar, 0 filas afectadas (0,03 seg)
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;

Consulta Aceptar, 0 filas afectadas (0,06 seg)

La CREATE TRIGGER sentencia crea un llamado gatillo ins_sum que est


asociado con la account mesa.Tambin incluye clusulas que especifican el
tiempo de activacin, el evento desencadenante, y qu hacer cuando el disparador
se activa:

La palabra clave BEFORE indica el tiempo de activacin. En este caso, el


gatillo se activa antes de cada fila insertada en la tabla. La otra palabra clave
aqu es permitido AFTER .

La palabra clave INSERT indica el evento de disparo; es decir, el tipo de


operacin que activa el gatillo. En el ejemplo, INSERT operaciones causan la
activacin

del

gatillo. Tambin

puede

crear

disparadores

para DELETE yUPDATE operaciones.

La declaracin siguiente FOR EACH ROW define el cuerpo del disparador; es


decir, la instruccin para ejecutar cada vez que el gatillo activa, que se produce
una vez por cada fila afectada por el evento de activacin. En el ejemplo, el
cuerpo de activador es un simple SET que se acumula en una variable de

usuario los valores insertados en la amount de la columna. La declaracin se


refiere

la

columna

como NEW.amount que

significa"el

valor

de

la amount columna que se inserta en la nueva fila. "


Para utilizar el disparador, establezca la variable acumulador a cero, ejecutar
un INSERT declaracin, y luego ver qu valor presenta luego la variable:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
-> IF NEW.amount < 0 THEN
->
SET NEW.amount = 0;
-> ELSEIF NEW.amount > 100 THEN
->
SET NEW.amount = 100;
-> END IF;
-> END;//
mysql> delimiter ;

VISTAS
En los ejemplos propuestos hasta ahora se ha operado en el nivel del modelo
lgico. Es decir, se ha asumido que el conjunto de relaciones que se da son las
relaciones reales guardadas en la base de datos. No es deseable que todos los
usuarios puedan ver la totalidad del modelo lgico. Las consideraciones sobre
la seguridad pueden exigir que algunos datos queden ocultos para los usuarios.
Considrese una persona quenecesita saber el nmero de prstamo de un cliente
pero que no necesita ver el importe del prstamo. Esta persona debera ver una
relacin descrita en el lgebra relacional mediante.

CREATE VIEW (Transact-SQL)


Crea una tabla virtual cuyo contenido (columnas y filas) se define mediante una
consulta. Utilice esta instruccin para crear una vista de los datos de una o varias
tablas de la base de datos. Por ejemplo, una vista se puede utilizar para lo
siguiente:
Para centrar, simplificar y personalizar la percepcin de la base de datos
para cada usuario.
Como mecanismo de seguridad, que permite a los usuarios obtener acceso
a los datos por medio de la vista, pero no les conceden el permiso de
obtener acceso directo a las tablas base subyacentes de la vista.

Para proporcionar una interfaz compatible con versiones anteriores para


emular una tabla cuyo esquema ha cambiado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ]
[;]
<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ]
}

Argumentos
schema_name
Es el nombre del esquema al que pertenece la vista.
view_name
Es el nombre de la vista. Los nombres de las vistas deben cumplir las reglas de los
identificadores. La especificacin del nombre del propietario de la vista es opcional.
column
Es el nombre que se va a utilizar para una columna en una vista. Solo se necesita un
nombre de columna cuando una columna proviene de una expresin aritmtica, una
funcin o una constante; cuando dos o ms columnas puedan tener el mismo
nombre, normalmente debido a una combinacin; o cuando una columna de una
vista recibe un nombre distinto al de la columna de la que proviene. Los nombres de
columna se pueden asignar tambin en la instruccin SELECT.
Si no se especifica el parmetro column, las columnas de la vista adquieren los
mismos nombres que las columnas de la instruccin SELECT.
AS
Especifica las acciones que va a llevar a cabo la vista.
select_statement
Es la instruccin SELECT que define la vista. Dicha instruccin puede utilizar ms
de una tabla y otras vistas. Se necesitan permisos adecuados para seleccionar los
objetos a los que se hace referencia en la clusula SELECT de la vista que se ha
creado.
Una vista no tiene por qu ser un simple subconjunto de filas y de columnas de una
tabla determinada. Es posible crear una vista que utilice ms de una tabla u otras
vistas mediante una clusula SELECT de cualquier complejidad.
En una definicin de vista indizada, la instruccin SELECT debe ser una
instruccin de una nica tabla o una instruccin JOIN de varias tablas con
agregacin opcional.
Las clusulas SELECT de una definicin de vista no pueden incluir lo siguiente:
Una clusula ORDER BY, a menos que tambin haya una clusula TOP en
la lista de seleccin de la instruccin SELECT
La palabra clave INTO

La clusula OPTION
Una referencia a una tabla temporal o a una variable de tabla
Dado que select_statement utiliza la instruccin SELECT, es vlido utilizar las
sugerencias <join_hint> y <table_hint> como se especifican en la clusula
FROM. Para obtener ms informacin, vea FROM (Transact-SQL) y SELECT
(Transact-SQL).
En select_statement se pueden utilizar funciones y varias instrucciones SELECT
separadas por UNION o UNION ALL.
CHECK OPTION
Exige que todas las instrucciones de modificacin de datos ejecutadas en la vista
sigan los criterios establecidos en select_statement. Cuando una fila se modifica
mediante una vista, WITH CHECK OPTION garantiza que los datos permanezcan
visibles en toda la vista despus de confirmar la modificacin.
ENCRYPTION
Cifra las entradas de sys.syscomments que contienen el texto de la instruccin
CREATE VIEW. El uso de WITH ENCRYPTION evita que la vista se publique
como parte de la replicacin de SQL Server.
SCHEMABINDING
Enlaza la vista al esquema de las tablas subyacentes. Cuando se especifica
SCHEMABINDING, las tablas base no se pueden modificar de una forma que
afecte a la definicin de la vista. En primer lugar, se debe modificar o quitar la
propia definicin de la vista para quitar las dependencias en la tabla que se va a
modificar. Cuando se utiliza SCHEMABINDING, select_statement debe incluir los
nombres de dos partes (schema.object) de las tablas, vistas o funciones definidas por
el usuario a las que se hace referencia. Todos los objetos a los que se hace
referencia se deben encontrar en la misma base de datos.
Las vistas o las tablas que participan en una vista creada con la clusula
SCHEMABINDING no se pueden quitar a menos que se quite o cambie esa vista de
forma que deje de tener un enlace de esquema. En caso contrario, Motor de base de
datos genera un error. Adems, la ejecucin de las instrucciones ALTER TABLE en
tablas que participan en vistas que tienen enlaces de esquema provoca un error si
estas instrucciones afectan a la definicin de la vista.
VIEW_METADATA
Especifica que la instancia de SQL Server devolver a las API de DB-Library,
ODBC y OLE DB la informacin de metadatos sobre la vista en vez de las tablas
base cuando se soliciten los metadatos del modo de exploracin para una consulta
que hace referencia a la vista. Los metadatos del modo de exploracin son
metadatos adicionales que la instancia de SQL Server devuelve a estas API del lado
cliente. Estos metadatos permiten a las API del lado cliente implementar cursores
del lado cliente actualizables. Los metadatos del modo de exploracin incluyen
informacin sobre la tabla base a la que pertenecen las columnas del conjunto de
resultados.
Para las vistas creadas con VIEW_METADATA, los metadatos del modo de
exploracin devuelven el nombre de vista y no los nombres de tablas base cuando
describen columnas de la vista en el conjunto de resultados.

CREATE VIEW Sintaxis


CREAR
[OR REPLACE]
[ALGORITMO = {Indefinido | MERGE | TEMPTABLE}]
[DEFINER = { usuario | CURRENT_USER}]
[SQL SEGURIDAD {DEFINER | invocador}]
VISTA view_name [( column_list )]
COMO select_statement
[CON [en cascada | LOCAL] CHECK OPTION]

El CREATE VIEW sentencia crea un nuevo punto de vista, o reemplaza una


existente si el O REEMPLAZAR se da clusula. Esta declaracin se aadi en
MySQL 5.0.1. Si la vista no existe, CREAR O CAMBIAR VISTA es el mismo
que CREATE VIEW . Si existe el punto de vista, crear o sustituir VISTA es el
mismo que ALTER VIEW.

El select_statement es un SELECT declaracin que ofrece la definicin de la


vista. (Cuando se selecciona desde el punto de vista, que selecciona en efecto
usando el SELECT declaracin.) select_statement puede seleccionar de las
tablas de base o de otros puntos de vista.
La definicin de la vista est " congelado " en el momento de la creacin, por lo
que los cambios en las tablas subyacentes despus no afectan a la definicin de
la vista. Por ejemplo, si un punto de vista se define comoSELECT * sobre una
mesa, nuevas columnas agregan a la tabla ms adelante no se conviertan en
parte de la vista.
El ALGORITMO clusula afecta cmo MySQL procesa la vista. Los definidor y de
seguridad de SQL clusulas especifican el contexto de seguridad que se utilizar
al comprobar los privilegios de acceso en tiempo de vista invocacin. El CHECK
OPTION CON clusula se puede dar para restringir inserciones o actualizaciones
de filas en tablas referenciadas por la vista. Estas clusulas se describen ms
adelante en esta seccin.

El CREATE VIEW declaracin requiere la CREATE VIEW privilegio para la vista, y


algn privilegio en cada columna seleccionada por el SELECT comunicado. Para
las columnas utilizadas en otras partes del SELECT declaracin debe tener
el SELECT privilegio. Si el O SUSTITUIR clusula est presente, tambin debe
tener la GOTA privilegio para la vista. CREATE VIEW tambin podra requerir
la SPER privilegio, dependiendo de la DEFINER valor, tal como se describe ms
adelante en esta seccin.
Cuando se hace referencia a una vista, comprobacin de privilegios se produce
como se describe ms adelante en esta seccin.
Una vista pertenece a una base de datos. De forma predeterminada, una nueva
vista se crea en la base de datos predeterminada. Para crear de forma explcita la
vista

en

una

base

de

datos

dada,

especifique

el

nombre

que base_de_datos.nombre_vista al crearlo:


mysql> CREATE VIEW test.v AS SELECT * FROM t;
Dentro de una base de datos, tablas base y vistas comparten el mismo espacio de
nombres, por lo que una tabla base y un punto de vista no pueden tener el mismo
nombre.
Columnas

recuperados

por

el SELECT declaracin

pueden

ser

simples

referencias a columnas de la tabla.Tambin pueden ser expresiones que utilizan


funciones, valores constantes, operadores, y as sucesivamente.
Vistas deben tener nombres de columnas nicas sin duplicados, al igual que las
tablas base. Por defecto, los nombres de las columnas recuperadas por
el SELECT declaracin se utilizan para los nombres de vista de columna. Para
definir

nombres

explcitos

de

las

columnas

de

la

vista,

el

opcional column_list clusula se puede dar como una lista de identificadores


separados por comas. El nmero de nombres en column_listdebe ser el mismo
que el nmero de columnas recuperadas por el SELECT comunicado.

FONDOS DOCUMENTALES
SITIOS WEB

http://dev.mysql.com/doc/refman/5.0/en/create-view.html
http://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html
http://msdn.microsoft.com/es-sv/library/ms189799.aspx
http://msdn.microsoft.com/es-sv/library/ms187956.aspx
BIBLIOGRAFIA

FUNDAMENTOS DE BASES DE DATOS


Cuarta edicin, Abraham Silberschatz

S-ar putea să vă placă și