-- V003__create_rol.sql -- Creates dbo.Rol master table (referenced by Usuario.Rol via FK in V004) and seeds -- the 8 canonical business roles (RBAC doc §2.4.2). -- Run on: SIGCM2 (prod) and SIGCM2_Test (integration tests) SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON; SET NOCOUNT ON; GO IF OBJECT_ID(N'dbo.Rol', N'U') IS NULL BEGIN CREATE TABLE dbo.Rol ( Id INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Rol PRIMARY KEY, Codigo VARCHAR(30) NOT NULL, Nombre NVARCHAR(60) NOT NULL, Descripcion NVARCHAR(250) NULL, Activo BIT NOT NULL CONSTRAINT DF_Rol_Activo DEFAULT(1), FechaCreacion DATETIME2(3) NOT NULL CONSTRAINT DF_Rol_FC DEFAULT(SYSUTCDATETIME()), FechaModificacion DATETIME2(3) NULL, CONSTRAINT UQ_Rol_Codigo UNIQUE (Codigo), -- Codigo format: lowercase letter followed by lowercase letters, digits or underscore. -- Using binary collation to enforce case-sensitivity (default DB collation is case-insensitive). CONSTRAINT CK_Rol_Codigo_Format CHECK ( PATINDEX('[a-z]%', Codigo COLLATE Latin1_General_BIN2) = 1 AND PATINDEX('%[^a-z0-9_]%', Codigo COLLATE Latin1_General_BIN2) = 0 ) ); PRINT 'Table dbo.Rol created successfully.'; END ELSE BEGIN PRINT 'Table dbo.Rol already exists — skipping create.'; END GO -- Seed 8 canonical roles (idempotent). MERGE dbo.Rol AS target USING (VALUES ('admin', N'Administrador', N'Supervisor total del sistema'), ('cajero', N'Cajero', N'Atención de mostrador, contado'), ('operador_ctacte', N'Operador Cta Cte', N'Gestión de cuenta corriente'), ('picadora', N'Picadora/Correctora', N'Edición de textos y corrección'), ('jefe_publicidad', N'Jefe de Publicidad', N'Supervisión de pauta y recursos'), ('productor', N'Productor', N'Consulta y carga restringida'), ('diagramacion', N'Diagramación/Taller', N'Solo lectura de pauta'), ('reportes', N'Reportes', N'Solo lectura de reportes y estadísticas') ) AS source (Codigo, Nombre, Descripcion) ON target.Codigo = source.Codigo WHEN NOT MATCHED BY TARGET THEN INSERT (Codigo, Nombre, Descripcion, Activo) VALUES (source.Codigo, source.Nombre, source.Descripcion, 1); GO PRINT 'Rol seeds applied (8 canonical roles).'; GO