The Seguridad system uses PostgreSQL as its database management system. This guide covers installation, schema creation, connection configuration, and maintenance procedures.
CREATE TABLE usuario ( usd VARCHAR(16) PRIMARY KEY, -- Username pwd VARCHAR(16) NOT NULL, -- Password (plain text) permisos VARCHAR(20) NOT NULL, -- Permission code circunscripcion VARCHAR(50), -- Jurisdiction nota TEXT, -- Notes cod VARCHAR(10), -- Code autorizado_carga_fuera_periodo DATE -- Authorized load date);-- Alternate table name used in some modulesCREATE TABLE hs_pswod ( usuario VARCHAR(16) PRIMARY KEY, pass VARCHAR(16) NOT NULL, categoria VARCHAR(20) NOT NULL, -- Permission category iniciales VARCHAR(50), -- Full name/description grupo VARCHAR(50), -- Group dependencia VARCHAR(100), -- Department autorizado INTEGER, -- Authorization flag telefono VARCHAR(500), -- Phone number(s) email VARCHAR(500), -- Email address sistema VARCHAR(50) DEFAULT 'horas_laborales');CREATE INDEX idx_usuario_categoria ON usuario(permisos);CREATE INDEX idx_usuario_circunscripcion ON usuario(circunscripcion);
dependencias Table
Departments and regional units:
CREATE TABLE dependencias ( id_dependencia SERIAL PRIMARY KEY, dependencia VARCHAR(100) NOT NULL, -- Department name relacion INTEGER, -- Regional unit (1-15) direccion VARCHAR(100), -- Address/Direction localidad VARCHAR(100), -- Location/Municipality id_direcciones INTEGER -- Parent direction ID);CREATE INDEX idx_dep_relacion ON dependencias(relacion);CREATE INDEX idx_dep_localidad ON dependencias(localidad);-- Sample data for UR 1INSERT INTO dependencias (dependencia, relacion, direccion, localidad) VALUES ('COMISARIA 1RA', 1, 'UR1', 'POSADAS'), ('COMISARIA 2DA', 1, 'UR1', 'POSADAS'), ('COMISARIA 3RA', 1, 'UR1', 'GARUPÁ');
preventivos Table
Prevention cases and incidents:
CREATE TABLE preventivos ( id SERIAL PRIMARY KEY, nro_preventivo VARCHAR(50) NOT NULL, fecha DATE NOT NULL, hora TIME, dependencia VARCHAR(100), delito VARCHAR(200), -- Crime type lugar VARCHAR(500), -- Location victima VARCHAR(200), -- Victim denunciante VARCHAR(200), -- Reporter imputado VARCHAR(200), -- Accused detenido BOOLEAN DEFAULT FALSE, -- Detained fiscal VARCHAR(100), -- Prosecutor juzgado VARCHAR(100), -- Court observaciones TEXT, -- Notes latitud DECIMAL(10, 8), -- Latitude longitud DECIMAL(11, 8), -- Longitude usuario_carga VARCHAR(16), -- User who loaded fecha_carga TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (dependencia) REFERENCES dependencias(dependencia), FOREIGN KEY (usuario_carga) REFERENCES usuario(usd));CREATE INDEX idx_prev_fecha ON preventivos(fecha);CREATE INDEX idx_prev_dependencia ON preventivos(dependencia);CREATE INDEX idx_prev_delito ON preventivos(delito);
operativos Table
Operational activities:
CREATE TABLE operativos ( id SERIAL PRIMARY KEY, tipo_operativo VARCHAR(100), -- Operation type fecha_inicio DATE, fecha_fin DATE, dependencias_participantes TEXT, -- JSON or CSV descripcion TEXT, resultados TEXT, personal_asignado INTEGER, recursos_utilizados TEXT, estado VARCHAR(50), -- Status usuario_registro VARCHAR(16), fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP);CREATE INDEX idx_oper_fecha ON operativos(fecha_inicio);CREATE INDEX idx_oper_estado ON operativos(estado);
CREATE TABLE misiones ( municipio VARCHAR(100) PRIMARY KEY, departamento VARCHAR(100), region VARCHAR(50), poblacion INTEGER, superficie DECIMAL(10, 2));
delitos - Crime Classifications
Crime type catalog:
CREATE TABLE delitos ( id SERIAL PRIMARY KEY, codigo VARCHAR(20) UNIQUE, descripcion VARCHAR(200) NOT NULL, categoria VARCHAR(100), gravedad VARCHAR(50));
-- Create databaseCREATE DATABASE seguridad_db WITH ENCODING = 'UTF8' LC_COLLATE = 'es_AR.UTF-8' LC_CTYPE = 'es_AR.UTF-8' TEMPLATE = template0;-- Connect to database\c seguridad_db-- Create schema (use SQL from "Database Schema" section above)-- Create initial admin userINSERT INTO usuario (usd, pwd, permisos) VALUES ('admin', 'admin123', '0');-- Grant permissionsGRANT ALL PRIVILEGES ON DATABASE seguridad_db TO postgres;GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO postgres;GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO postgres;
<?phpif (function_exists('pg_connect')) { echo "PostgreSQL support is enabled";} else { echo "PostgreSQL support is NOT enabled";}phpinfo(); // Check for pgsql section?>
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'seguridad_db';
2
Restore Database
# From custom format backuppg_restore -U postgres -p 5434 -d seguridad_db \ -v seguridad_20260305.backup# From SQL scriptpsql -U postgres -p 5434 -d seguridad_db \ < seguridad_20260305.sql
3
Verify Restoration
-- Check record countsSELECT 'usuario' as tabla, COUNT(*) FROM usuarioUNION ALLSELECT 'preventivos', COUNT(*) FROM preventivosUNION ALLSELECT 'dependencias', COUNT(*) FROM dependencias;
-- Create indexes on frequently queried columnsCREATE INDEX idx_prev_fecha_dep ON preventivos(fecha, dependencia);CREATE INDEX idx_prev_delito_fecha ON preventivos(delito, fecha);-- Analyze tables for query optimizationANALYZE usuario;ANALYZE preventivos;ANALYZE dependencias;
Connection Pooling
Consider implementing pgBouncer for connection pooling:
Critical Security Improvements NeededThe current implementation has several security vulnerabilities:
1. Use Parameterized Queries
// Current (vulnerable to SQL injection)$sql = "SELECT * FROM usuario WHERE usd='$user' AND pwd='$pass'";// Improved (parameterized)$sql = "SELECT * FROM usuario WHERE usd=$1 AND pwd=$2";$result = pg_query_params($con, $sql, array($user, $pass));
2. Hash Passwords
// Store hashed passwords$hashed = password_hash($password, PASSWORD_ARGON2ID);// Update schemaALTER TABLE usuario ALTER COLUMN pwd TYPE VARCHAR(255);
3. Restrict Database User
-- Create application user with limited privilegesCREATE USER seguridad_app WITH PASSWORD 'strong_password';-- Grant only necessary permissionsGRANT CONNECT ON DATABASE seguridad_db TO seguridad_app;GRANT SELECT, INSERT, UPDATE ON ALL TABLES TO seguridad_app;GRANT USAGE ON ALL SEQUENCES TO seguridad_app;-- Revoke DELETE on critical tablesREVOKE DELETE ON usuario FROM seguridad_app;