Objective
Create a system for logging access control events with associated badge photos and entry camera images, enabling visual verification and audit trails.
Step 1: Create Access Points Table
Define controlled entry points.
CREATE TABLE access_points (
id INTEGER PRIMARY KEY,
point_id VARCHAR(50) NOT NULL UNIQUE,
point_name VARCHAR(200),
building VARCHAR(100),
floor VARCHAR(20),
area_type VARCHAR(50),
security_level INTEGER DEFAULT 1,
has_camera BOOLEAN DEFAULT TRUE,
has_intercom BOOLEAN DEFAULT FALSE,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Step 2: Create Personnel Table
Store authorized personnel.
CREATE TABLE access_personnel (
id INTEGER PRIMARY KEY,
employee_id VARCHAR(50) NOT NULL UNIQUE,
first_name VARCHAR(100),
last_name VARCHAR(100),
department VARCHAR(100),
title VARCHAR(100),
badge_number VARCHAR(50) UNIQUE,
badge_photo IMAGE(JPEG),
access_level INTEGER DEFAULT 1,
status VARCHAR(50) DEFAULT 'active',
hire_date DATE,
badge_issued DATE,
badge_expires DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Step 3: Create Access Permissions Table
Define who can access what.
CREATE TABLE access_permissions (
id INTEGER PRIMARY KEY,
personnel_id INTEGER NOT NULL,
access_point_id INTEGER NOT NULL,
permission_type VARCHAR(50) DEFAULT 'standard',
valid_from TIME,
valid_to TIME,
valid_days VARCHAR(20) DEFAULT '1234567',
granted_by VARCHAR(100),
granted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE,
FOREIGN KEY (personnel_id) REFERENCES access_personnel(id),
FOREIGN KEY (access_point_id) REFERENCES access_points(id)
);
Step 4: Create Access Events Table
Log access attempts.
CREATE TABLE access_events (
id INTEGER PRIMARY KEY,
access_point_id INTEGER NOT NULL,
personnel_id INTEGER,
badge_number VARCHAR(50),
event_time TIMESTAMP NOT NULL,
event_type VARCHAR(50),
direction VARCHAR(20),
access_granted BOOLEAN,
denial_reason VARCHAR(100),
entry_image IMAGE(JPEG),
verification_method VARCHAR(50),
reader_id VARCHAR(50),
FOREIGN KEY (access_point_id) REFERENCES access_points(id),
FOREIGN KEY (personnel_id) REFERENCES access_personnel(id)
);
Step 5: Create Visitor Logs Table
Track visitor access.
CREATE TABLE visitor_logs (
id INTEGER PRIMARY KEY,
visitor_id VARCHAR(50) UNIQUE,
first_name VARCHAR(100),
last_name VARCHAR(100),
company VARCHAR(200),
visitor_photo IMAGE(JPEG),
host_employee_id INTEGER,
purpose VARCHAR(255),
badge_number VARCHAR(50),
check_in_time TIMESTAMP,
check_out_time TIMESTAMP,
access_areas TEXT,
id_verified BOOLEAN DEFAULT FALSE,
nda_signed BOOLEAN DEFAULT FALSE,
FOREIGN KEY (host_employee_id) REFERENCES access_personnel(id)
);
Step 6: Insert Access Points
Add controlled doors.
INSERT INTO access_points (id, point_id, point_name, building, floor, area_type, security_level, has_camera, has_intercom) VALUES
(1, 'AP-MAIN-001', 'Main Entrance', 'Building A', 'Ground', 'entrance', 1, TRUE, TRUE),
(2, 'AP-LOBBY-001', 'Lobby to Office', 'Building A', 'Ground', 'interior', 2, TRUE, FALSE),
(3, 'AP-SERVER-001', 'Server Room Entry', 'Building A', '2', 'restricted', 5, TRUE, TRUE),
(4, 'AP-EXEC-001', 'Executive Suite', 'Building A', '3', 'restricted', 4, TRUE, TRUE),
(5, 'AP-LAB-001', 'R&D Laboratory', 'Building B', '1', 'restricted', 4, TRUE, TRUE),
(6, 'AP-PARK-001', 'Parking Garage Entry', 'Parking', 'P1', 'vehicle', 1, TRUE, TRUE),
(7, 'AP-LOAD-001', 'Loading Dock', 'Building A', 'Ground', 'delivery', 2, TRUE, TRUE),
(8, 'AP-EMRG-001', 'Emergency Exit North', 'Building A', 'Ground', 'emergency', 1, TRUE, FALSE);
Step 7: Insert Personnel
Add authorized employees.
INSERT INTO access_personnel (id, employee_id, first_name, last_name, department, title, badge_number, access_level, status, hire_date, badge_issued, badge_expires) VALUES
(1, 'EMP-001', 'John', 'Smith', 'IT', 'System Administrator', 'B-10001', 5, 'active', '2020-03-15', '2023-01-01', '2025-01-01'),
(2, 'EMP-002', 'Sarah', 'Johnson', 'Engineering', 'Senior Engineer', 'B-10002', 4, 'active', '2019-06-01', '2023-01-01', '2025-01-01'),
(3, 'EMP-003', 'Michael', 'Williams', 'Finance', 'Accountant', 'B-10003', 2, 'active', '2021-09-15', '2023-01-01', '2025-01-01'),
(4, 'EMP-004', 'Emily', 'Brown', 'HR', 'HR Manager', 'B-10004', 3, 'active', '2018-04-01', '2023-01-01', '2025-01-01'),
(5, 'EMP-005', 'David', 'Davis', 'R&D', 'Research Scientist', 'B-10005', 4, 'active', '2022-01-10', '2023-01-01', '2025-01-01'),
(6, 'EMP-006', 'Lisa', 'Martinez', 'Executive', 'CEO', 'B-10006', 5, 'active', '2015-01-01', '2023-01-01', '2025-01-01'),
(7, 'EMP-007', 'Robert', 'Garcia', 'Security', 'Security Officer', 'B-10007', 3, 'active', '2020-08-01', '2023-01-01', '2025-01-01'),
(8, 'EMP-008', 'Jennifer', 'Lee', 'IT', 'Network Engineer', 'B-10008', 4, 'active', '2021-03-20', '2023-01-01', '2025-01-01');
Step 8: Insert Access Permissions
Grant access rights.
INSERT INTO access_permissions (id, personnel_id, access_point_id, permission_type, valid_from, valid_to, valid_days, granted_by) VALUES
-- Main entrance - everyone
(1, 1, 1, 'standard', '06:00:00', '22:00:00', '1234567', 'Security Admin'),
(2, 2, 1, 'standard', '06:00:00', '22:00:00', '1234567', 'Security Admin'),
(3, 3, 1, 'standard', '07:00:00', '19:00:00', '12345', 'Security Admin'),
(4, 4, 1, 'standard', '06:00:00', '22:00:00', '1234567', 'Security Admin'),
(5, 5, 1, 'standard', '06:00:00', '22:00:00', '1234567', 'Security Admin'),
(6, 6, 1, '24_7', NULL, NULL, '1234567', 'Security Admin'),
(7, 7, 1, '24_7', NULL, NULL, '1234567', 'Security Admin'),
(8, 8, 1, 'standard', '06:00:00', '22:00:00', '1234567', 'Security Admin'),
-- Server room - IT only
(9, 1, 3, '24_7', NULL, NULL, '1234567', 'IT Director'),
(10, 8, 3, 'standard', '08:00:00', '18:00:00', '12345', 'IT Director'),
-- Executive suite
(11, 6, 4, '24_7', NULL, NULL, '1234567', 'Security Admin'),
(12, 4, 4, 'standard', '08:00:00', '18:00:00', '12345', 'HR Director'),
-- R&D Lab
(13, 5, 5, 'standard', '06:00:00', '22:00:00', '1234567', 'R&D Director'),
(14, 2, 5, 'standard', '06:00:00', '22:00:00', '1234567', 'R&D Director');