--UNIDAD 4

CREATE DATABASE BANCO
USE BANCO
CREATE TABLE CLIENTE
(
id_cliente INT not null,
nombre VARCHAR(30) not null,
telefono VARCHAR(12),
PRIMARY KEY(id_cliente)
)
CREATE TABLE CUENTA
(
id_cuenta INT not null,
monto INT,
cve_cliente INT not null,
PRIMARY KEY(id_cuenta),
FOREIGN KEY(cve_cliente) REFERENCES CLIENTE(id_cliente)
)
--Agrega una restricción Check para validar que el monto  de la cuenta sea mayor a Cero.
 
ALTER TABLE CUENTA 
IADD CONSTRAINT CK_CUENTA_monto 
check (monto>=0); 
INSERT INTO CLIENTE(id_cliente,nombre,telefono) values
(1,'PEDRO LARES','99999'),
(2,'AGAPITO BUELNA','99999'),
(3,'EMILIO LOPEZ','999999'),
(4,'CAMILO SUAREZ','999999')
INSERT INTO CUENTA(id_cuenta,monto,cve_cliente) values
(100,1000,1),
(200,1000,2),
(300,1000,3),
(400,1000,4)
--visualizar las tablas
SELECT * FROM CLIENTE
SELECT * FROM CUENTA
--Transaccion Exitosa 
BEGIN TRANSACTION DEPOSITO
 UPDATE CUENTA SET monto=monto+10000 WHERE cve_cliente=1
 --Visualizar la tabla CUENTA para checar el monto del cliente 1
 COMMIT TRANSACTION DEPOSITO
/*CHECAMOS*/
SELECT * FROM CUENTA
--Transaccion Rechazada
BEGIN TRANSACTION RETIRO
 UPDATE CUENTA SET MONTO=MONTO-10000 WHERE cve_cliente=1 
-Visualizar la tabla CUENTA para checar el monto del cliente 1
 ROLLBACK TRANSACTION RETIRO
/*CHECAMOS*/
SELECT * FROM CUENTA
--Transaccion Con Save Point
BEGIN TRANSACTION NUEVA 
UPDATE CLIENTE SET nombre='PANFILO' where id_cliente=1 
SAVE TRANSACTION MARCA
UPDATE CLIENTE SET nombre='MARIA' where id_cliente=2
UPDATE CLIENTE SET nombre='GRACIELA' where id_cliente=3 
ROLLBACK TRANSACTION MARCA 
COMMIT TRANSACTION NUEVA
/*CHECAMOS*/
SELECT * FROM CLIENTE
/*RETOMAMOS EL EJEMPLO DEL VIDEO, CON UN NUMERO DE CONTROL 
EXISTENTE*/ 
--Transaccion Alta Fracaso en CLIENTE
BEGIN TRANSACTION ALTA_FRACASO
SAVE TRANSACTION SAVE_ALTA_FRA
INSERT INTO CLIENTE (id_cliente,nombre) VALUES (1,'LUISA')
IF(@@ERROR <> 0)
BEGIN
 ROLLBACK TRANSACTION SAVE_ALTA_FRA
 PRINT('ERROR FALLASTE, YA EXISTE ESTE CLIENTE....!!!')
END
ELSE
BEGIN
 COMMIT TRANSACTION ALTA_FRACASO
 PRINT('BIEN, EXITO.....!!!')
 END 
/*CHECAMOS*/
SELECT * FROM CLIENTE
--Transaccion Alta Exitosa en CLIENTE
BEGIN TRANSACTION ALTA_EXITO
SAVE TRANSACTION SAVE_ALTA_EX
INSERT INTO CLIENTE (id_cliente,nombre) VALUES (5,'LUISA')
IF(@@ERROR <> 0)
BEGIN
 ROLLBACK TRANSACTION SAVE_ALTA_EX
 PRINT('ERROR FALLASTE, YA EXISTE ESTE CLIENTE....!!!')
END
ELSE
BEGIN
 COMMIT TRANSACTION ALTA_EXITO
 PRINT('BIEN, EXITO.....!!!')
 END 
/*CHECAMOS*/
SELECT * FROM CLIENTE
--RETIRO2 CON MENSAJE DE ERROR
BEGIN TRANSACTION RETIRO2
SAVE TRANSACTION SAVE_RETIRO2
 UPDATE CUENTA SET monto=monto-1000 WHERE cve_cliente=1
 --Visualizar la tabla CUENTA para checar el monto del 
cliente 1
 
 IF(@@ERROR <> 0)
BEGIN
 ROLLBACK TRANSACTION SAVE_RETIRO2
 PRINT('ERROR SALDO INSUFICIENTE....!!!')
END
 ELSE
BEGIN
 COMMIT TRANSACTION RETIRO2
 PRINT('RETIRO EXITOSO.....!!!')
 END 
/*CHECAMOS*/
SELECT * FROM CUENTA
-- RETIRO3 CON MENSAJE DE ERROR
BEGIN TRANSACTION RETIRO3
SAVE TRANSACTION SAVE_RETIRO3
 UPDATE CUENTA SET monto=monto-3000 WHERE cve_cliente=2
 --Visualizar la tabla CUENTA para checar el monto del cliente 1
 IF(@@ERROR <> 0)
BEGIN
 ROLLBACK TRANSACTION SAVE_RETIRO3
 PRINT('ERROR SALDO INSUFICIENTE....!!!')
END
 ELSE
BEGIN
 COMMIT TRANSACTION RETIRO3
 PRINT('RETIRO EXITOSO.....!!!')
 END 
/*CHECAMOS*/
SELECT * FROM CUENTA

--UNIDAD 5

/* FUNCION PARA PASAR A MAYUSCULA UNA PALABRA*/
CREATE FUNCTION DBO.MAYUSCULA
(@PALABRA VARCHAR(45))
RETURNS VARCHAR(45)
AS
BEGIN
 SET @PALABRA=UPPER(@PALABRA)
 RETURN @PALABRA
END
--Ejecutar la función.-
PRINT DBO.MAYUSCULA('maria lopez')

--PROCEDURE
CREATE PROCEDURE WSP_LISTA_ALUMNOS 
AS 
SELECT CONTROL AS CONTROL,NOMBRE_ALUMNO+' '+APELLIDO_PATERNO+' 
'+APELLIDO_MATERNO AS NOMBRE_ALUMNO, CORREO_ELECTRONICO FROM ALUMNO 
 
--EJECUTAR.-
EXEC WSP_LISTA_ALUMNOS
--OTRO
CREATE PROCEDURE WSP_FECHANACIMIENTO 
@F1 DATETIME
AS 
BEGIN 
 SELECT * FROM ALUMNO WHERE FECHA_NACIMIENTO = @F1
END
--EJECUTAR.- 
EXECUTE WSP_FECHANACIMIENTO @F1='19-11-1993'
GO
--OTRO
CREATE PROCEDURE WSP_ENTIDAD_FEDERATIVA 
@entidad float 
AS 
SELECT * FROM ALUMNO WHERE entidad_procedencia = @entidad 
GO 
EJECUTAR.- 
EXEC WSP_ENTIDAD_FEDERATIVA @entidad=26 
GO



--TRIGGERS
CREATE TRIGGER NOMBRE_TRIGGER 
ON [TABLE | VIEW ] 
FOR | AFTER |INSTEAD OF
[ INSERT ][ , ][ UPDATE ][ ,] [ DELETE ] 
AS 
BEGIN
SENTENCIA_SQL 
END
/*
FOR | AFTER: AFTER específica que el desencadenador DML sólo se activa 
cuando todas las operaciones especificadas en la instrucción SQL 
desencadenadora se han ejecutado correctamente. Además, todas las acciones 
referenciales en cascada y comprobaciones de restricciones deben ser correctas 
para que este desencadenador se ejecute. AFTER es el valor predeterminado 
cuando solo se especifica la palabra FOR. Los desencadenarores AFTER no se 
pueden definir en las vistas. 
INSTEAD OF: Especifica que se ejecuta el desencadenador DML en vez de 
la instrucción SQL desencadenadora, por lo que se suplantan las acciones de las 
instrucciones desencadenadoras. INSTEAD OF no se puede especificar para 
desencadenadores DDL. Como máximo, se puede definir un desencadenador*/

--d).-DESACTIVAR UN TRIGGER 
ALTER TRIGGER nombreTrigger DISABLE;