Creación de Bases de Datos y Tablas en SQL Server: Separación y Adjunto

Archivos que componen una base de datos

Una base de datos en SQL Server se compone de archivos de datos y registros de transacciones. Los archivos de datos principales tienen extensión .mdf, los secundarios .ndf y los registros .ldf. Cada base de datos debe contener eaxctamente un archivo prinicpal (.mdf), mientras que los archivos secundarios y de registros pueden ser múltiples.

Creación de una base de datos

Para crear una base de datos, se utiliza el lenguaje T-SQL. El siguiente ejemplo muestra cómo definir una base de datos con archivos de datos y registros, asegurando que se verifique su existencia previa.

-- Usar la base de datos maestra para operaciones de administración
USE master;
GO

-- Verificar y eliminar la base de datos si ya existe
IF EXISTS(SELECT * FROM sysdatabases WHERE name = 'GestionEstudiantesDB')
    DROP DATABASE GestionEstudiantesDB;
GO

-- Crear la nueva base de datos
CREATE DATABASE GestionEstudiantesDB
ON PRIMARY
(
    NAME = 'GestionEstudiantesDB_Principal',
    FILENAME = 'C:\Datos\GestionEstudiantesDB_Principal.mdf',
    SIZE = 25MB,
    FILEGROWTH = 10MB
),
(
    NAME = 'GestionEstudiantesDB_Secundario',
    FILENAME = 'C:\Datos\GestionEstudiantesDB_Secundario.ndf',
    SIZE = 25MB,
    FILEGROWTH = 10MB
)
LOG ON
(
    NAME = 'GestionEstudiantesDB_Registro',
    FILENAME = 'C:\Datos\GestionEstudiantesDB_Registro.ldf',
    SIZE = 15MB,
    FILEGROWTH = 5MB
);
GO

Creación de tablas

Las tablas se definen dentro de una base de datos específica. Es recomendable utilizar convenciones de nombres consistentes, como PascalCase. A continuación, se crean varias tablas con tipos de datos y restricciones.

-- Usar la base de datos creada
USE GestionEstudiantesDB;
GO

-- Tabla de clases
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'Clases')
    DROP TABLE Clases;
GO
CREATE TABLE Clases
(
    ClaseID INT PRIMARY KEY,
    NombreClase VARCHAR(25) NOT NULL
);
GO

-- Tabla de estudiantes
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'Estudiantes')
    DROP TABLE Estudiantes;
GO
CREATE TABLE Estudiantes
(
    ID INT IDENTITY(100001,1) PRIMARY KEY,
    Nombre VARCHAR(25) NOT NULL,
    Genero CHAR(2) CHECK(Genero = 'M' OR Genero = 'F'),
    FechaNacimiento DATETIME NOT NULL,
    DocumentoIdentidad NUMERIC(18,0) CHECK(LEN(DocumentoIdentidad) = 18) UNIQUE,
    Edad INT CHECK(Edad >= 18 AND Edad <= 30),
    Telefono VARCHAR(15),
    Direccion NVARCHAR(150) DEFAULT('No especificada'),
    ClaseID INT REFERENCES Clases(ClaseID)
);
GO

-- Tabla de administradores
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'Administradores')
    DROP TABLE Administradores;
GO
CREATE TABLE Administradores
(
    AdminID INT IDENTITY(500,1) PRIMARY KEY,
    Contrasena VARCHAR(20) NOT NULL,
    NombreAdmin VARCHAR(20) NOT NULL
);
GO

-- Tabla de calificaciones
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'Calificaciones')
    DROP TABLE Calificaciones;
GO
CREATE TABLE Calificaciones
(
    CalificacionID INT IDENTITY(1,1) PRIMARY KEY,
    EstudianteID INT REFERENCES Estudiantes(ID),
    Matematicas INT NULL,
    Programacion INT NULL,
    FechaRegistro DATETIME DEFAULT(GETDATE())
);
GO

Adición de restricciones de manera separada

Aunque es preferible definir restricciones durante la creación de tablas, es posible agregarlas posteriormente. El siguiente código ejemplifica cómo añadir restricciones de clave primaria, única, de verificación y externa a una tabla existente.

USE GestionEstudiantesDB;
GO

-- Restricción de clave primaria
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'pk_IDEstudiante')
    ALTER TABLE Estudiantes DROP CONSTRAINT pk_IDEstudiante;
GO
ALTER TABLE Estudiantes ADD CONSTRAINT pk_IDEstudiante PRIMARY KEY(ID);

-- Restricción única para documento
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'uq_Documento')
    ALTER TABLE Estudiantes DROP CONSTRAINT uq_Documento;
GO
ALTER TABLE Estudiantes ADD CONSTRAINT uq_Documento UNIQUE(DocumentoIdentidad);

-- Restricción de verificación para edad
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'ck_RangoEdad')
    ALTER TABLE Estudiantes DROP CONSTRAINT ck_RangoEdad;
GO
ALTER TABLE Estudiantes ADD CONSTRAINT ck_RangoEdad CHECK(Edad BETWEEN 18 AND 30);

-- Restricción de longitud para teléfono
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'ck_LongitudTelefono')
    ALTER TABLE Estudiantes DROP CONSTRAINT ck_LongitudTelefono;
GO
ALTER TABLE Estudiantes ADD CONSTRAINT ck_LongitudTelefono CHECK(LEN(Telefono) = 10);

-- Restricción externa
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'fk_ClaseRelacion')
    ALTER TABLE Estudiantes DROP CONSTRAINT fk_ClaseRelacion;
GO
ALTER TABLE Estudiantes ADD CONSTRAINT fk_ClaseRelacion FOREIGN KEY (ClaseID) REFERENCES Clases(ClaseID);
GO

Separación y adjunto de bases de datos

La separación de una base de datos consiste en desvincular sus archivos del motor de SQL Server, permitiendo copiarlos o moverlos como archivos normales. El adjunto es el proceso inverso, donde se vinculan estos archivos al motor para su uso.

Proceso de separación

Utilice el comando sp_detach_db en T-SQL o las herramientas gráficas de SQL Server Management Studio (SSMS) para separar una base de datos. Asegúrese de que no haya conexiones activas a la base de datos antes de separarla.

Proceso de adjunto

Para adjuntar una base de datos, use el comando CREATE DATA BASE con la opción FOR ATTACH, o emplee SSMS. Especifique la ubicación de los archivos .mdf y .ldf.

Solución a errores al adjuntar bases de datos

Los errores durante el adjunto suelen deberse a permisos insuficientes en la carpeta que contiene los archivos físicos. Para resolver esto, navegue a la carpeta, haga clic derecho y seleccione "Propiedades". En la pestaña "Seguridad", edite los permisos y agregue el usuario "Everyone" con control total. Esto garantiza que SQL Server pueda acceder a los archivos necesarios.

Etiquetas: SQL Server bases de datos tablas restricciones separación de bases de datos

Publicado el 6-9 04:50