-- Cambiar a master y eliminar base si existe
USE master;
GO
IF DB_ID('BombaCombustible') IS NOT NULL
BEGIN
ALTER DATABASE BombaCombustible SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE BombaCombustible;
END
GO
-- Crear nueva base de datos
CREATE DATABASE BombaCombustible;
GO
USE BombaCombustible;
GO
-- Eliminar objetos si existen
IF OBJECT_ID('Compras', 'U') IS NOT NULL DROP TABLE Compras;
IF OBJECT_ID('Inventario', 'U') IS NOT NULL DROP TABLE Inventario;
IF OBJECT_ID('Productos', 'U') IS NOT NULL DROP TABLE Productos;
IF OBJECT_ID('Clientes', 'U') IS NOT NULL DROP TABLE Clientes;
IF OBJECT_ID('VistaProductosConEnc', 'V') IS NOT NULL DROP VIEW
VistaProductosConEnc;
IF OBJECT_ID('VistaPreciosOrdenados', 'V') IS NOT NULL DROP VIEW
VistaPreciosOrdenados;
IF OBJECT_ID('VistaVentasDetalladas', 'V') IS NOT NULL DROP VIEW
VistaVentasDetalladas;
IF OBJECT_ID('ObtenerTotalCompras', 'P') IS NOT NULL DROP PROCEDURE
ObtenerTotalCompras;
IF OBJECT_ID('ObtenerDatosCliente', 'P') IS NOT NULL DROP PROCEDURE
ObtenerDatosCliente;
GO
-- Crear tabla Clientes: almacena datos del cliente, tipo de vehículo y tipo
de cliente
CREATE TABLE Clientes (
ID INT PRIMARY KEY IDENTITY(1,1),
Nombre VARCHAR(100) NOT NULL,
Cedula VARCHAR(15) UNIQUE NOT NULL,
Telefono VARCHAR(15),
Email VARCHAR(100),
TipoVehiculo VARCHAR(20) CHECK (TipoVehiculo IN ('Carro', 'Motor',
'Camion')),
TipoCliente VARCHAR(20) CHECK (TipoCliente IN ('Regular', 'Corporativo'))
);
GO
-- Crear tabla Productos: define el producto, tipo (ej. Combustible), y
unidad (ej. Galon)
CREATE TABLE Productos (
ID INT PRIMARY KEY IDENTITY(1,1),
Nombre VARCHAR(100) NOT NULL,
Precio DECIMAL(10,2) NOT NULL,
TipoProducto VARCHAR(50) CHECK (TipoProducto IN ('Combustible',
'Lubricante', 'Otro')),
Unidad VARCHAR(10) CHECK (Unidad IN ('Litro', 'Galon'))
);
GO
-- Crear tabla Inventario: almacena la cantidad disponible por producto
CREATE TABLE Inventario (
ProductoID INT PRIMARY KEY,
StockInicial DECIMAL(10,2) NOT NULL,
StockActual DECIMAL(10,2) NOT NULL,
FOREIGN KEY (ProductoID) REFERENCES Productos(ID)
);
GO
-- Crear tabla Compras: cada transacción con su cantidad, descuento y fecha
CREATE TABLE Compras (
ID INT PRIMARY KEY IDENTITY(1,1),
ClienteID INT NOT NULL,
ProductoID INT NOT NULL,
Cantidad DECIMAL(10,2) NOT NULL,
Descuento DECIMAL(10,2) DEFAULT 0 CHECK (Descuento >= 0 AND Descuento <=
100),
Fecha DATETIME DEFAULT GETDATE(),
FOREIGN KEY (ClienteID) REFERENCES Clientes(ID),
FOREIGN KEY (ProductoID) REFERENCES Productos(ID)
);
GO
-- Vista encriptada: oculta el SELECT al usuario final
CREATE VIEW VistaProductosConEnc
WITH ENCRYPTION
AS
SELECT ID, Nombre, Precio, TipoProducto, Unidad FROM Productos;
GO
-- Vista de precios: muestra productos y precios, ordenados externamente al
consultar
CREATE VIEW VistaPreciosOrdenados AS
SELECT Nombre, Precio, Unidad
FROM Productos;
GO
-- Vista de ventas detalladas: une clientes, productos y calcula total pagado
CREATE VIEW VistaVentasDetalladas AS
SELECT
[Link] AS CompraID,
[Link] AS Cliente,
[Link],
[Link],
[Link] AS Producto,
[Link],
[Link],
[Link],
[Link],
[Link],
([Link] * [Link]) * (1 - [Link] / 100.0) AS TotalPagado,
[Link]
FROM Compras c
JOIN Clientes cl ON [Link] = [Link]
JOIN Productos p ON [Link] = [Link];
GO
-- Procedimiento: devuelve total gastado por un cliente (con descuentos)
CREATE PROCEDURE ObtenerTotalCompras
@cliente_id INT
AS
BEGIN
SELECT
[Link],
[Link],
SUM(([Link] * [Link]) * (1 - [Link] / 100.0)) AS
TotalGastado
FROM Compras c
JOIN Productos p ON [Link] = [Link]
JOIN Clientes cl ON [Link] = [Link]
WHERE [Link] = @cliente_id
GROUP BY [Link], [Link];
END;
GO
-- Procedimiento: devuelve todos los datos de un cliente por ID
CREATE PROCEDURE ObtenerDatosCliente
@cliente_id INT
AS
BEGIN
SELECT * FROM Clientes WHERE ID = @cliente_id;
END;
GO
-- Insertar cliente de ejemplo
INSERT INTO Clientes (Nombre, Cedula, Telefono, Email, TipoVehiculo,
TipoCliente)
VALUES ('Juan Perez', '001-1234567-8', '8091234567', 'juan@[Link]',
'Carro', 'Corporativo');
GO
-- Insertar productos ejemplo
INSERT INTO Productos (Nombre, Precio, TipoProducto, Unidad)
VALUES
('Gasolina Premium', 280.50, 'Combustible', 'Galon'),
('Gasolina Regular', 265.00, 'Combustible', 'Galon'),
('Diesel', 240.00, 'Combustible', 'Galon');
GO
-- Registrar inventario inicial
INSERT INTO Inventario (ProductoID, StockInicial, StockActual)
VALUES (1, 1000, 940), (2, 1000, 960), (3, 1000, 980);
GO
-- Insertar compras de prueba
INSERT INTO Compras (ClienteID, ProductoID, Cantidad, Descuento)
VALUES (1, 1, 20, 5), (1, 2, 15, 0);
GO
-- Ejecutar procedimientos y vistas de prueba
EXEC ObtenerTotalCompras @cliente_id = 1;
EXEC ObtenerDatosCliente @cliente_id = 1;
SELECT * FROM VistaProductosConEnc;
SELECT * FROM VistaPreciosOrdenados ORDER BY Nombre ASC;
SELECT * FROM VistaVentasDetalladas;