# TRIGGER

***

```
-- Usando la base de datos Northwind
USE Northwind;

-- Trigger que muestra un mensaje cuando se inserta un registro en Categories
CREATE TRIGGER TR_T1
ON Categories
FOR INSERT
AS
    PRINT 'Usuario ingresó un registro'
GO

-- Insertar una categoría para probar TR_T1
INSERT INTO Categories (CategoryName) VALUES ('Acme')
GO

-- Trigger que muestra un mensaje al actualizar, insertar o eliminar registros en Categories
CREATE TRIGGER TR_T2
ON Categories
FOR UPDATE, INSERT, DELETE
AS
    PRINT 'Usuario ACTUALIZÓ un registro'
GO

-- Actualizar una categoría para probar TR_T2
UPDATE Categories SET CategoryName = 'Acme2' WHERE CategoryID = 9
GO

-- Mostrar todos los triggers
SELECT * FROM sys.triggers;

-- Eliminar TR_T2
DROP TRIGGER TR_T2;

-- Mostrar Categories después de los cambios
SELECT * FROM Categories;

-- Trigger para guardar registros eliminados de Categories en historial1
CREATE TABLE historial1 (
    cod INT,
    nom VARCHAR(100),
    descripcion VARCHAR(100),
    foto VARCHAR(100)
)
GO

-- Eliminar columnas de historial1
ALTER TABLE historial1 DROP COLUMN descripcion, foto;

-- Crear TR_T3 para guardar registros eliminados de la categoría
CREATE TRIGGER TR_T3
ON Categories
FOR DELETE
AS
BEGIN
    INSERT INTO historial1 SELECT CategoryID, CategoryName FROM deleted
END
GO

-- Mostrar Categories, eliminar una categoría y mostrar historial1
SELECT * FROM Categories;
DELETE FROM Categories WHERE CategoryID = 9;
SELECT * FROM historial1;

-- Mostrar todos los Shippers
SELECT * FROM Shippers;

-- Trigger para mantener el historial de registros actualizados en Shippers (almacena los valores antiguos y nuevos)
CREATE TABLE Historial2 (
    COD INT,
    NOM NVARCHAR(40),
    CEL NVARCHAR(24),
    COMENTARIO VARCHAR(MAX)
)

CREATE TRIGGER TR_T4
ON Shippers
FOR UPDATE
AS
BEGIN
    INSERT INTO Historial2 SELECT *, 'Registro Antiguo' FROM deleted;
    INSERT INTO Historial2 SELECT *, 'Registro Nuevo' FROM inserted;
END
GO

-- Mostrar y actualizar un shipper
SELECT * FROM Shippers;
UPDATE Shippers SET CompanyName = 'Carlos' WHERE ShipperID = 4;
SELECT * FROM Historial2;

-- Trigger para almacenar registros eliminados en HISTORIAL3
CREATE TABLE HISTORIAL3 (
    COD INT,
    NOM VARCHAR(100),
    USUARIO VARCHAR(100),
    SERVIDOR VARCHAR(100),
    FECHA DATETIME,
    COMENTARIO VARCHAR(100)
)
GO

-- Mostrar HISTORIAL3
SELECT * FROM HISTORIAL3;

-- Trigger para almacenar registros eliminados en HISTORIAL3
ALTER TRIGGER TR_T5
ON SHIPPERS
AFTER DELETE
AS
SET NOCOUNT ON
BEGIN
    INSERT INTO HISTORIAL3 
    SELECT ShipperID, CompanyName, SYSTEM_USER, @@SERVERNAME, GETDATE(), 'Eliminación de registro' FROM deleted
END
GO

-- Insertar y eliminar un shipper, luego mostrar HISTORIAL3
INSERT INTO Shippers VALUES ('Elvis', '999');
DELETE FROM Shippers WHERE ShipperID = 5;
SELECT * FROM HISTORIAL3;

-- Restricciones (Primary Key, Unique, Check, Default)

-- Ejemplo de Primary Key
CREATE TABLE EJEMPLO1 (
    COD INT PRIMARY KEY,
    NOM VARCHAR(MAX)
);
SELECT * FROM EJEMPLO1;
INSERT INTO EJEMPLO1 VALUES (5, 'PEDRO'), (3, 'MIGUEL'), (9, 'JAVIER');
CREATE TABLE EJEMPLO2 (
    COD INT,
    NOM VARCHAR(MAX)
);
SELECT * FROM EJEMPLO2;
INSERT INTO EJEMPLO2 VALUES (5, 'PEDRO'), (3, 'MIGUEL'), (9, 'JAVIER');
SP_HELP EJEMPLO1;

-- Eliminar la restricción PK
ALTER TABLE EJEMPLO1 DROP CONSTRAINT PK__EJEMPLO1__C1FF6E91F12C82A5;

-- Agregar una nueva restricción PK
ALTER TABLE EJEMPLO1 ADD CONSTRAINT PK_RESTR1 PRIMARY KEY (COD);

-- Ejemplo de restricción Unique
CREATE TABLE EJEMPLO3 (
    COD INT PRIMARY KEY IDENTITY,
    NOM VARCHAR(MAX) NOT NULL,
    DNI CHAR(9) UNIQUE
);
INSERT INTO EJEMPLO3 VALUES ('PEDRO', '111111111');
INSERT INTO EJEMPLO3 VALUES ('MIGUEL', '222222222');
INSERT INTO EJEMPLO3 (NOM) VALUES ('ROSA');
SELECT * FROM EJEMPLO3;

-- Ejemplo de restricción Check
CREATE TABLE EJEMPLO4 (
    COD INT PRIMARY KEY IDENTITY,
    NOM VARCHAR(100) UNIQUE NOT NULL,
    CANT INT CHECK (CANT >= 0)
);
SELECT * FROM EJEMPLO4;
INSERT INTO EJEMPLO4 VALUES ('PAPEL', 5);
INSERT INTO EJEMPLO4 VALUES ('TOALLA', 2);

-- Tabla con condición para el estado del alumno
CREATE TABLE EJEMPLO5 (
    COD INT PRIMARY KEY IDENTITY,
    NOM VARCHAR(100) NOT NULL,
    CONDICION VARCHAR(100) CHECK (CONDICION IN ('APROBADO', 'DESAPROBADO'))
);
INSERT INTO EJEMPLO5 VALUES ('PEDRO', 'APROBADO');
SELECT * FROM EJEMPLO5;

-- Ejemplo de valor por defecto
CREATE TABLE EJEMPLO6 (
    COD INT PRIMARY KEY IDENTITY,
    NOM VARCHAR(100) NOT NULL,
    DIR VARCHAR(100) DEFAULT 'NO RECUERDO'
);
SELECT * FROM EJEMPLO6;
INSERT INTO EJEMPLO6 (NOM) VALUES ('PEDRO');
INSERT INTO EJEMPLO6 VALUES ('MIGUEL', DEFAULT);

-- Ejercicio: Crear la tabla ALUMNO
CREATE TABLE ALUMNO (
    COD INT PRIMARY KEY IDENTITY, 
    NOM VARCHAR(100) NOT NULL, 
    DNI VARCHAR(10) UNIQUE NOT NULL, 
    NOTA FLOAT CHECK (NOTA BETWEEN 0 AND 20), 
    CELULAR VARCHAR(100) UNIQUE NOT NULL, 
    COMENTARIO VARCHAR(MAX) DEFAULT 'S/C'
);

-- Crear otro ejemplo alternativo para la tabla ALUMNO
CREATE TABLE ejemplo7 (
    cod INT PRIMARY KEY IDENTITY, 
    nom VARCHAR(500) NOT NULL, 
    dni CHAR(8) UNIQUE NOT NULL, 
    nota INT CHECK (nota >= 0 AND nota <= 20), 
    celular CHAR(9) UNIQUE NOT NULL, 
    comentario VARCHAR(100) DEFAULT 'S/C'
);

-- Crear otro ejemplo para la tabla ALUMNO
CREATE TABLE alumno (
    cod INT PRIMARY KEY IDENTITY,
    nom VARCHAR(50) NOT NULL,
    dni CHAR(8) UNIQUE NOT NULL, 
    nota INT CHECK (nota >= 0 AND nota <= 20),
    celular CHAR(9) UNIQUE NOT NULL, 
    coment VARCHAR(100) DEFAULT 'S/C'
);

```
