41 lines
1.5 KiB
PL/PgSQL
41 lines
1.5 KiB
PL/PgSQL
-- Tabla de usuarios
|
|
-- Almacena información de autenticación y perfil de usuarios
|
|
|
|
CREATE TABLE IF NOT EXISTS usuarios (
|
|
id SERIAL PRIMARY KEY,
|
|
username VARCHAR(50) NOT NULL UNIQUE,
|
|
email VARCHAR(255) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW(),
|
|
last_login TIMESTAMP,
|
|
is_active BOOLEAN DEFAULT TRUE,
|
|
CONSTRAINT username_min_length CHECK (LENGTH(username) >= 3),
|
|
CONSTRAINT email_format CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
|
|
);
|
|
|
|
-- Índices para búsquedas rápidas
|
|
CREATE INDEX IF NOT EXISTS idx_usuarios_username ON usuarios(username);
|
|
CREATE INDEX IF NOT EXISTS idx_usuarios_email ON usuarios(email);
|
|
CREATE INDEX IF NOT EXISTS idx_usuarios_active ON usuarios(is_active) WHERE is_active = TRUE;
|
|
|
|
-- Trigger para actualizar updated_at
|
|
CREATE OR REPLACE FUNCTION update_usuario_timestamp()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER trigger_update_usuario_timestamp
|
|
BEFORE UPDATE ON usuarios
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_usuario_timestamp();
|
|
|
|
-- Comentarios
|
|
COMMENT ON TABLE usuarios IS 'Usuarios registrados del sistema';
|
|
COMMENT ON COLUMN usuarios.username IS 'Nombre de usuario único';
|
|
COMMENT ON COLUMN usuarios.email IS 'Correo electrónico único';
|
|
COMMENT ON COLUMN usuarios.password_hash IS 'Hash bcrypt de la contraseña';
|
|
COMMENT ON COLUMN usuarios.is_active IS 'Indica si la cuenta está activa';
|