Taller de base de datos
Práctica: Manejo de transacciones en SQL Server
1. Crear el siguiente esquema de base de datos.
CREATE DATABASE banmodelo;
USE banmodelo;
CREATE TABLE cliente(id INT PRIMARY KEY, nombre VARCHAR(50)
,apellidos VARCHAR(50), telefono VARCHAR(10));
CREATE TABLE cuenta(numCuenta VARCHAR(10) PRIMARY KEY, tipo VARCHAR(25), saldo
FLOAT,
idCliente INT FOREIGN KEY REFERENCES cliente(id));
CREATE TABLE movimiento (
numCuenta VARCHAR(10) NOT NULL,
numCuenta2 VARCHAR(10) NOT NULL,
importe FLOAT,
fecha DATE,
PRIMARY KEY (numCuenta, numCuenta2),
CONSTRAINT FK_MOV
FOREIGN KEY (numCuenta)
REFERENCES cuenta (numCuenta),
CONSTRAINT FK_MOV2
FOREIGN KEY (numCuenta2)
REFERENCES cuenta (numCuenta));
2. Insertar los siguientes datos:
INSERT INTO cliente VALUES(1,'Daniel','Martinez','9991970752');
INSERT INTO cliente VALUES(2,'Alan','Brito','9999123456');
INSERT INTO cuenta VALUES(7685,'debito',6500,1);
INSERT INTO cuenta VALUES(1287,'credito',7500,1);
INSERT INTO cuenta VALUES(7690,'debito',4500,2);
Taller de base de datos
3. Ejecutar la siguiente transacción.
--Transacción al hacer una transferencia a una cuenta existente en la BD
BEGIN TRANSACTION
BEGIN TRY
--1)Descontar de la cuenta origen
UPDATE cuenta SET saldo=saldo -2500 WHERE numCuenta=7685;
--2) Abonarlo a la cuenta destino
UPDATE cuenta SET saldo=saldo + 2500 WHERE numCuenta=7690;
--3) Insertar el movimiento
INSERT INTO movimiento VALUES(7685,7690,2500, '2019-03-28');
PRINT 'TRANSACCION EXITOSA'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
PRINT 'OCURRIO UN ERROR EN LA TRANSACCION'
END CATCH
4. Ejecutar las siguientes consultas y verificar que el saldo de las 2 cuentas se ha
actualizado y se ha insertado un nuevo movimiento.
SELECT * FROM cuenta;
SELECT * FROM movimiento;
5. Ejecutar la siguiente transacción.
--Transacción al hacer una transferencia a una cuenta no existente en la BD
BEGIN TRANSACTION
BEGIN TRY
--1)Descontar de la cuenta origen
UPDATE cuenta SET saldo=saldo -1500 WHERE numCuenta=7685;
--2) Abonarlo a la cuenta destino
UPDATE cuenta SET saldo=saldo + 1500 WHERE numCuenta=1000;
Taller de base de datos
--3) Insertar el movimiento
INSERT INTO movimiento VALUES(7685,1000,1500, '2019-03-28');
PRINT 'TRANSACCION EXITOSA'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
PRINT 'OCURRIO UN ERROR EN LA TRANSACCION'
END CATCH
Como podemos observar el numCuenta 1000 no existe en la tabla cuentas, lo cual causa
un error en la transacción y se ejecuta la instrucción ROLLBACK, deshaciendo los cambios.
6. Verificar que no se hacen cambios en las cuentas y no se inserta el movimiento.