TheLim148 преди 2 седмици
родител
ревизия
e307bae74d
променени са 2 файла, в които са добавени 1054 реда и са изтрити 1 реда
  1. 0 1
      .gitignore
  2. 1054 0
      Autoschool_PM11/autoschool.sql

+ 0 - 1
.gitignore

@@ -21,7 +21,6 @@ packages/
 # Database
 database/
 csv/
-*.sql
 
 # Screenshots and temporary images
 *.png

+ 1054 - 0
Autoschool_PM11/autoschool.sql

@@ -0,0 +1,1054 @@
+--
+-- PostgreSQL database dump
+--
+
+\restrict wUhTUEtP7H3sZbn0Sj8yBWOgI7rW8eGIJqHJvYsaK1avC0CCtslcJ40NJgPs7Rm
+
+-- Dumped from database version 18.0
+-- Dumped by pg_dump version 18.0
+
+-- Started on 2026-06-02 17:20:08
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET transaction_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 10 (class 2615 OID 442812)
+-- Name: akulova_vs; Type: SCHEMA; Schema: -; Owner: akulova_vs
+--
+
+CREATE SCHEMA akulova_vs;
+
+
+ALTER SCHEMA akulova_vs OWNER TO akulova_vs;
+
+--
+-- TOC entry 2457 (class 1247 OID 448285)
+-- Name: app_role; Type: TYPE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TYPE akulova_vs.app_role AS ENUM (
+    'admin',
+    'user'
+);
+
+
+ALTER TYPE akulova_vs.app_role OWNER TO akulova_vs;
+
+--
+-- TOC entry 1805 (class 1255 OID 454368)
+-- Name: fn_audit_log_changes(); Type: FUNCTION; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE FUNCTION akulova_vs.fn_audit_log_changes() RETURNS trigger
+    LANGUAGE plpgsql
+    AS $$
+declare
+    pk_column text := tg_argv[0];
+    row_data jsonb;
+    current_record_id integer;
+begin
+    if tg_op = 'DELETE' then
+        row_data := to_jsonb(old);
+    else
+        row_data := to_jsonb(new);
+    end if;
+
+    current_record_id := nullif(row_data ->> pk_column, '')::integer;
+
+    insert into akulova_vs.audit_log (
+        table_name,
+        operation,
+        record_id,
+        changed_by,
+        old_data,
+        new_data
+    ) values (
+        tg_table_name,
+        tg_op,
+        current_record_id,
+        current_user,
+        case when tg_op in ('UPDATE', 'DELETE') then to_jsonb(old) else null end,
+        case when tg_op in ('INSERT', 'UPDATE') then to_jsonb(new) else null end
+    );
+
+    if tg_op = 'DELETE' then
+        return old;
+    end if;
+
+    return new;
+end;
+$$;
+
+
+ALTER FUNCTION akulova_vs.fn_audit_log_changes() OWNER TO akulova_vs;
+
+--
+-- TOC entry 1772 (class 1255 OID 450327)
+-- Name: fn_authenticate_user(text, text); Type: FUNCTION; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE FUNCTION akulova_vs.fn_authenticate_user(p_login text, p_password text) RETURNS TABLE(user_id integer, login character varying, role text, instructor_id integer, driver_id integer)
+    LANGUAGE sql STABLE
+    AS $$
+    select
+        au.user_id,
+        au.login,
+        au.role::text,
+        au.instructor_id,
+        au.driver_id
+    from akulova_vs.app_users au
+    where au.login = p_login
+      and au.password_hash = public.crypt(p_password, au.password_hash)
+      and au.is_active = true
+    limit 1;
+$$;
+
+
+ALTER FUNCTION akulova_vs.fn_authenticate_user(p_login text, p_password text) OWNER TO akulova_vs;
+
+--
+-- TOC entry 1753 (class 1255 OID 448456)
+-- Name: fn_hash_password(text); Type: FUNCTION; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE FUNCTION akulova_vs.fn_hash_password(p_password text) RETURNS text
+    LANGUAGE sql
+    AS $$
+    select public.crypt(p_password, public.gen_salt('bf'));
+$$;
+
+
+ALTER FUNCTION akulova_vs.fn_hash_password(p_password text) OWNER TO akulova_vs;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 614 (class 1259 OID 448321)
+-- Name: app_users; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.app_users (
+    user_id integer NOT NULL,
+    login character varying(80) NOT NULL,
+    password_hash text NOT NULL,
+    role akulova_vs.app_role NOT NULL,
+    is_active boolean DEFAULT true NOT NULL,
+    instructor_id integer,
+    driver_id integer,
+    CONSTRAINT chk_app_users_user_has_driver CHECK ((((role = 'admin'::akulova_vs.app_role) AND (driver_id IS NULL)) OR ((role = 'user'::akulova_vs.app_role) AND (driver_id IS NOT NULL))))
+);
+
+
+ALTER TABLE akulova_vs.app_users OWNER TO akulova_vs;
+
+--
+-- TOC entry 613 (class 1259 OID 448320)
+-- Name: app_users_user_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.app_users ALTER COLUMN user_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.app_users_user_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 1003 (class 1259 OID 454349)
+-- Name: audit_log; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.audit_log (
+    log_id integer NOT NULL,
+    table_name character varying(80) NOT NULL,
+    operation character varying(10) NOT NULL,
+    record_id integer,
+    changed_at timestamp without time zone DEFAULT now() NOT NULL,
+    changed_by character varying(80) DEFAULT CURRENT_USER NOT NULL,
+    old_data jsonb,
+    new_data jsonb,
+    CONSTRAINT audit_log_operation_check CHECK (((operation)::text = ANY ((ARRAY['INSERT'::character varying, 'UPDATE'::character varying, 'DELETE'::character varying])::text[])))
+);
+
+
+ALTER TABLE akulova_vs.audit_log OWNER TO akulova_vs;
+
+--
+-- TOC entry 1002 (class 1259 OID 454348)
+-- Name: audit_log_log_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.audit_log ALTER COLUMN log_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.audit_log_log_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 616 (class 1259 OID 448344)
+-- Name: drivers; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.drivers (
+    driver_id integer NOT NULL,
+    school_id integer NOT NULL,
+    last_name character varying(80) NOT NULL,
+    first_name character varying(80) NOT NULL,
+    middle_name character varying(80),
+    birth_date date NOT NULL,
+    phone character varying(20),
+    CONSTRAINT chk_drivers_birth_date_min_age CHECK ((birth_date <= ((CURRENT_DATE - '16 years'::interval))::date)),
+    CONSTRAINT chk_drivers_phone_format CHECK (((phone IS NULL) OR ((phone)::text ~ '^\+?[0-9 ()-]{5,25}$'::text)))
+);
+
+
+ALTER TABLE akulova_vs.drivers OWNER TO akulova_vs;
+
+--
+-- TOC entry 615 (class 1259 OID 448343)
+-- Name: drivers_driver_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.drivers ALTER COLUMN driver_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.drivers_driver_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 610 (class 1259 OID 448294)
+-- Name: driving_schools; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.driving_schools (
+    school_id integer NOT NULL,
+    school_name character varying(150) NOT NULL,
+    address text NOT NULL,
+    phone character varying(20),
+    CONSTRAINT chk_schools_phone_format CHECK (((phone IS NULL) OR ((phone)::text ~ '^\+?[0-9 ()-]{5,25}$'::text)))
+);
+
+
+ALTER TABLE akulova_vs.driving_schools OWNER TO akulova_vs;
+
+--
+-- TOC entry 609 (class 1259 OID 448293)
+-- Name: driving_schools_school_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.driving_schools ALTER COLUMN school_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.driving_schools_school_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 618 (class 1259 OID 448360)
+-- Name: exam_routes; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.exam_routes (
+    route_id integer NOT NULL,
+    route_name character varying(120) NOT NULL,
+    start_address text NOT NULL,
+    end_address text NOT NULL,
+    difficulty character varying(30) NOT NULL,
+    CONSTRAINT chk_exam_routes_difficulty CHECK (((difficulty)::text = ANY ((ARRAY['легкий'::character varying, 'средний'::character varying, 'сложный'::character varying])::text[])))
+);
+
+
+ALTER TABLE akulova_vs.exam_routes OWNER TO akulova_vs;
+
+--
+-- TOC entry 617 (class 1259 OID 448359)
+-- Name: exam_routes_route_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.exam_routes ALTER COLUMN route_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.exam_routes_route_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 624 (class 1259 OID 448393)
+-- Name: exams; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.exams (
+    exam_id integer NOT NULL,
+    driver_id integer NOT NULL,
+    route_id integer NOT NULL,
+    inspector_id integer NOT NULL,
+    exam_date date NOT NULL,
+    result character varying(20) NOT NULL,
+    CONSTRAINT chk_exams_result CHECK (((result)::text = ANY ((ARRAY['сдан'::character varying, 'не сдан'::character varying])::text[])))
+);
+
+
+ALTER TABLE akulova_vs.exams OWNER TO akulova_vs;
+
+--
+-- TOC entry 623 (class 1259 OID 448392)
+-- Name: exams_exam_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.exams ALTER COLUMN exam_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.exams_exam_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 612 (class 1259 OID 448305)
+-- Name: instructors; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.instructors (
+    instructor_id integer NOT NULL,
+    school_id integer NOT NULL,
+    last_name character varying(80) NOT NULL,
+    first_name character varying(80) NOT NULL,
+    middle_name character varying(80),
+    phone character varying(20),
+    license_number character varying(30) NOT NULL,
+    CONSTRAINT chk_instructors_phone_format CHECK (((phone IS NULL) OR ((phone)::text ~ '^\+?[0-9 ()-]{5,25}$'::text)))
+);
+
+
+ALTER TABLE akulova_vs.instructors OWNER TO akulova_vs;
+
+--
+-- TOC entry 611 (class 1259 OID 448304)
+-- Name: instructors_instructor_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.instructors ALTER COLUMN instructor_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.instructors_instructor_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 626 (class 1259 OID 448420)
+-- Name: licenses; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.licenses (
+    license_id integer NOT NULL,
+    driver_id integer NOT NULL,
+    officer_id integer NOT NULL,
+    issue_date date NOT NULL,
+    category character varying(10) NOT NULL,
+    license_number character varying(30) NOT NULL,
+    CONSTRAINT chk_licenses_category CHECK (((category)::text = ANY ((ARRAY['A'::character varying, 'B'::character varying, 'C'::character varying, 'D'::character varying, 'BE'::character varying, 'CE'::character varying, 'DE'::character varying])::text[])))
+);
+
+
+ALTER TABLE akulova_vs.licenses OWNER TO akulova_vs;
+
+--
+-- TOC entry 625 (class 1259 OID 448419)
+-- Name: licenses_license_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.licenses ALTER COLUMN license_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.licenses_license_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 620 (class 1259 OID 448373)
+-- Name: traffic_inspectors; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.traffic_inspectors (
+    inspector_id integer NOT NULL,
+    last_name character varying(80) NOT NULL,
+    first_name character varying(80) NOT NULL,
+    middle_name character varying(80),
+    rank_name character varying(80) NOT NULL
+);
+
+
+ALTER TABLE akulova_vs.traffic_inspectors OWNER TO akulova_vs;
+
+--
+-- TOC entry 619 (class 1259 OID 448372)
+-- Name: traffic_inspectors_inspector_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.traffic_inspectors ALTER COLUMN inspector_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.traffic_inspectors_inspector_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 622 (class 1259 OID 448383)
+-- Name: traffic_officers; Type: TABLE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TABLE akulova_vs.traffic_officers (
+    officer_id integer NOT NULL,
+    last_name character varying(80) NOT NULL,
+    first_name character varying(80) NOT NULL,
+    middle_name character varying(80),
+    position_name character varying(120) NOT NULL
+);
+
+
+ALTER TABLE akulova_vs.traffic_officers OWNER TO akulova_vs;
+
+--
+-- TOC entry 621 (class 1259 OID 448382)
+-- Name: traffic_officers_officer_id_seq; Type: SEQUENCE; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE akulova_vs.traffic_officers ALTER COLUMN officer_id ADD GENERATED BY DEFAULT AS IDENTITY (
+    SEQUENCE NAME akulova_vs.traffic_officers_officer_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1
+);
+
+
+--
+-- TOC entry 1001 (class 1259 OID 454343)
+-- Name: v_exam_search; Type: VIEW; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE VIEW akulova_vs.v_exam_search AS
+ SELECT e.exam_id,
+    e.exam_date,
+    e.result,
+    concat_ws(' '::text, d.last_name, d.first_name, d.middle_name) AS driver_full_name,
+    ds.school_name,
+    er.route_name,
+    concat_ws(' '::text, ti.last_name, ti.first_name, ti.middle_name) AS inspector_full_name,
+    (row_number() OVER (PARTITION BY e.driver_id ORDER BY e.exam_date, e.exam_id))::integer AS attempt_number,
+    (EXTRACT(year FROM age((e.exam_date)::timestamp with time zone, (d.birth_date)::timestamp with time zone)))::integer AS driver_age
+   FROM ((((akulova_vs.exams e
+     JOIN akulova_vs.drivers d ON ((d.driver_id = e.driver_id)))
+     JOIN akulova_vs.driving_schools ds ON ((ds.school_id = d.school_id)))
+     JOIN akulova_vs.exam_routes er ON ((er.route_id = e.route_id)))
+     JOIN akulova_vs.traffic_inspectors ti ON ((ti.inspector_id = e.inspector_id)));
+
+
+ALTER VIEW akulova_vs.v_exam_search OWNER TO akulova_vs;
+
+--
+-- TOC entry 6227 (class 0 OID 448321)
+-- Dependencies: 614
+-- Data for Name: app_users; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.app_users (user_id, login, password_hash, role, is_active, instructor_id, driver_id) FROM stdin;
+1	admin	$1$adm2026$f/c1i.QLTZq9f0yi58hF./	admin	t	1	\N
+2	user	$1$usr2026$TH.zVKjQW4ADmsUOkhAi01	user	t	\N	1
+3	ivanov	$1$ivanov26$RIsEw0mN69yf0AIDaIl/x0	user	t	\N	2
+4	smirnova	$1$smirn26$AXwttYrGMEPAdMwyF7JGF/	user	t	\N	3
+5	kuzmin	$1$kuzmin26$qc4zcHQl0zHs/XEZp1JfN/	user	t	\N	4
+6	volkova	$1$volkov26$QVaboMFeUPclfBgauZxuE/	user	t	\N	5
+\.
+
+
+--
+-- TOC entry 6241 (class 0 OID 454349)
+-- Dependencies: 1003
+-- Data for Name: audit_log; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.audit_log (log_id, table_name, operation, record_id, changed_at, changed_by, old_data, new_data) FROM stdin;
+3	traffic_officers	DELETE	7	2026-06-02 15:45:20.119893	admin	{"last_name": "Иванов", "first_name": "Иван", "officer_id": 7, "middle_name": "Иванович", "position_name": "специалист по выдаче удостоверений"}	\N
+1	traffic_officers	INSERT	6	2026-06-02 15:11:15.206198	admin	\N	{"last_name": "Непоткупнов", "first_name": "Константин", "officer_id": 6, "middle_name": "Сергеевич", "position_name": "специалист по выдаче удостоверений"}
+2	traffic_officers	INSERT	7	2026-06-02 15:38:00.496125	admin	\N	{"last_name": "Иванов", "first_name": "Иван", "officer_id": 7, "middle_name": "Иванович", "position_name": "специалист по выдаче удостоверений"}
+4	driving_schools	INSERT	6	2026-06-02 16:54:29.853262	akulova_vs	\N	{"phone": "+ 7 8162 80-90-10", "address": "ул Гагарина, 37A", "school_id": 6, "school_name": "Автошкола Шанс"}
+5	driving_schools	UPDATE	6	2026-06-02 16:54:39.890178	akulova_vs	{"phone": "+ 7 8162 80-90-10", "address": "ул Гагарина, 37A", "school_id": 6, "school_name": "Автошкола Шанс"}	{"phone": "+ 7 8162 80-90-20", "address": "ул Гагарина, 37A", "school_id": 6, "school_name": "Автошкола Шанс"}
+6	driving_schools	DELETE	6	2026-06-02 16:54:45.676122	akulova_vs	{"phone": "+ 7 8162 80-90-20", "address": "ул Гагарина, 37A", "school_id": 6, "school_name": "Автошкола Шанс"}	\N
+7	instructors	INSERT	9	2026-06-02 16:56:11.176451	akulova_vs	\N	{"phone": "+7 900 999-99-99", "last_name": "Т", "school_id": 4, "first_name": "Т", "middle_name": "Т", "instructor_id": 9, "license_number": "INS-009"}
+8	instructors	UPDATE	9	2026-06-02 16:56:16.350856	akulova_vs	{"phone": "+7 900 999-99-99", "last_name": "Т", "school_id": 4, "first_name": "Т", "middle_name": "Т", "instructor_id": 9, "license_number": "INS-009"}	{"phone": "+7 900 999-99-99", "last_name": "Т", "school_id": 4, "first_name": "ТE", "middle_name": "Т", "instructor_id": 9, "license_number": "INS-009"}
+9	instructors	DELETE	9	2026-06-02 16:56:19.916324	akulova_vs	{"phone": "+7 900 999-99-99", "last_name": "Т", "school_id": 4, "first_name": "ТE", "middle_name": "Т", "instructor_id": 9, "license_number": "INS-009"}	\N
+10	drivers	INSERT	11	2026-06-02 16:57:11.182215	akulova_vs	\N	{"phone": "+ 7 900 600 45 45", "driver_id": 11, "last_name": "n", "school_id": 2, "birth_date": "2007-05-04", "first_name": "n", "middle_name": null}
+11	drivers	DELETE	11	2026-06-02 16:57:24.148653	akulova_vs	{"phone": "+ 7 900 600 45 45", "driver_id": 11, "last_name": "n", "school_id": 2, "birth_date": "2007-05-04", "first_name": "n", "middle_name": null}	\N
+12	drivers	UPDATE	6	2026-06-02 16:57:46.715882	akulova_vs	{"phone": "+7 900 999-00-11", "driver_id": 6, "last_name": "Морозова", "school_id": 5, "birth_date": "2003-01-25", "first_name": "Дарья", "middle_name": "Алексеевна"}	{"phone": "+7 900 999-00-11", "driver_id": 6, "last_name": "Морозова", "school_id": 5, "birth_date": "2007-01-25", "first_name": "Дарья", "middle_name": "Алексеевна"}
+13	traffic_inspectors	UPDATE	1	2026-06-02 16:58:01.520372	akulova_vs	{"last_name": "Морозов", "rank_name": "старший лейтенант", "first_name": "Павел", "middle_name": "Сергеевич", "inspector_id": 1}	{"last_name": "Морозов", "rank_name": "майор", "first_name": "Павел", "middle_name": "Сергеевич", "inspector_id": 1}
+14	traffic_inspectors	UPDATE	1	2026-06-02 17:08:03.177358	admin	{"last_name": "Морозов", "rank_name": "майор", "first_name": "Павел", "middle_name": "Сергеевич", "inspector_id": 1}	{"last_name": "Морозов", "rank_name": "старший лейтенант", "first_name": "Павел", "middle_name": "Сергеевич", "inspector_id": 1}
+\.
+
+
+--
+-- TOC entry 6229 (class 0 OID 448344)
+-- Dependencies: 616
+-- Data for Name: drivers; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.drivers (driver_id, school_id, last_name, first_name, middle_name, birth_date, phone) FROM stdin;
+1	1	Петров	Илья	Андреевич	2001-05-20	+7 900 444-44-44
+2	2	Иванов	Сергей	Петрович	2000-11-14	+7 900 555-55-55
+3	3	Смирнова	Анна	Олеговна	1999-03-08	+7 900 666-66-66
+4	1	Кузьмин	Даниил	Романович	2002-07-12	+7 900 777-77-77
+5	4	Волкова	Екатерина	Ильинична	2001-12-02	+7 900 888-88-88
+7	2	Лебедев	Максим	Викторович	1998-09-17	+7 901 111-22-33
+8	3	Семенова	Полина	Дмитриевна	2004-04-10	+7 901 222-33-44
+9	4	Зайцев	Никита	Павлович	2000-06-30	+7 901 333-44-55
+10	5	Андреева	Алина	Сергеевна	2002-10-05	+7 901 444-55-66
+6	5	Морозова	Дарья	Алексеевна	2007-01-25	+7 900 999-00-11
+\.
+
+
+--
+-- TOC entry 6223 (class 0 OID 448294)
+-- Dependencies: 610
+-- Data for Name: driving_schools; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.driving_schools (school_id, school_name, address, phone) FROM stdin;
+1	Автошкола Старт	ул. Большая Московская, 12	+7 8162 10-20-30
+2	Автошкола Вектор	ул. Псковская, 25	+7 8162 20-30-40
+3	Автошкола Драйв	пр-т Мира, 8	+7 8162 30-40-50
+4	Автошкола Профи	ул. Ломоносова, 18	+7 8162 40-50-60
+5	Автошкола Магистраль	ул. Кочетова, 31	+7 8162 50-60-70
+\.
+
+
+--
+-- TOC entry 6231 (class 0 OID 448360)
+-- Dependencies: 618
+-- Data for Name: exam_routes; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.exam_routes (route_id, route_name, start_address, end_address, difficulty) FROM stdin;
+1	Маршрут №1 - центр	ул. Большая Московская, 12	Сенная площадь	легкий
+2	Маршрут №2 - город	ул. Псковская, 25	Воскресенский бульвар	средний
+3	Маршрут №3 - сложный	пр-т Мира, 8	ул. Кочетова, 30	сложный
+4	Маршрут №4 - учебная площадка	ул. Ломоносова, 18	ул. Нехинская, 57	легкий
+5	Маршрут №5 - кольцевая развязка	ул. Кочетова, 31	пр-т Александра Корсунова, 14	средний
+\.
+
+
+--
+-- TOC entry 6237 (class 0 OID 448393)
+-- Dependencies: 624
+-- Data for Name: exams; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.exams (exam_id, driver_id, route_id, inspector_id, exam_date, result) FROM stdin;
+2	2	2	2	2026-05-21	не сдан
+3	3	3	3	2026-05-22	сдан
+4	4	4	4	2026-05-23	не сдан
+5	5	5	5	2026-05-24	сдан
+6	6	1	2	2026-05-25	сдан
+7	7	2	3	2026-05-26	не сдан
+8	8	3	4	2026-05-27	сдан
+9	9	4	5	2026-05-28	сдан
+10	10	5	1	2026-05-29	не сдан
+11	2	2	2	2026-06-05	сдан
+12	4	4	4	2026-06-06	сдан
+1	1	1	1	2026-05-20	сдан
+\.
+
+
+--
+-- TOC entry 6225 (class 0 OID 448305)
+-- Dependencies: 612
+-- Data for Name: instructors; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.instructors (instructor_id, school_id, last_name, first_name, middle_name, phone, license_number) FROM stdin;
+1	1	Соколов	Алексей	Игоревич	+7 900 111-11-11	INS-001
+2	2	Кузнецова	Марина	Олеговна	+7 900 222-22-22	INS-002
+3	3	Орлов	Дмитрий	Павлович	+7 900 333-33-33	INS-003
+4	1	Николаев	Артём	Сергеевич	+7 900 444-11-22	INS-004
+5	4	Федорова	Ирина	Владимировна	+7 900 555-22-33	INS-005
+6	5	Григорьев	Павел	Андреевич	+7 900 666-33-44	INS-006
+7	2	Мельникова	Ольга	Петровна	+7 900 777-44-55	INS-007
+8	3	Белов	Кирилл	Олегович	+7 900 888-55-66	INS-008
+\.
+
+
+--
+-- TOC entry 6239 (class 0 OID 448420)
+-- Dependencies: 626
+-- Data for Name: licenses; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.licenses (license_id, driver_id, officer_id, issue_date, category, license_number) FROM stdin;
+1	1	1	2026-05-21	B	VU-2026-0001
+2	3	3	2026-05-23	B	VU-2026-0002
+3	5	5	2026-05-25	B	VU-2026-0003
+4	6	2	2026-05-26	C	VU-2026-0004
+5	8	4	2026-05-28	B	VU-2026-0005
+6	9	5	2026-05-29	A	VU-2026-0006
+7	2	2	2026-06-06	B	VU-2026-0007
+8	4	4	2026-06-07	B	VU-2026-0008
+\.
+
+
+--
+-- TOC entry 6233 (class 0 OID 448373)
+-- Dependencies: 620
+-- Data for Name: traffic_inspectors; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.traffic_inspectors (inspector_id, last_name, first_name, middle_name, rank_name) FROM stdin;
+2	Васильева	Елена	Александровна	капитан
+3	Никитин	Роман	Игоревич	майор
+4	Савельев	Олег	Владимирович	лейтенант
+5	Крылова	Наталья	Павловна	подполковник
+1	Морозов	Павел	Сергеевич	старший лейтенант
+\.
+
+
+--
+-- TOC entry 6235 (class 0 OID 448383)
+-- Dependencies: 622
+-- Data for Name: traffic_officers; Type: TABLE DATA; Schema: akulova_vs; Owner: akulova_vs
+--
+
+COPY akulova_vs.traffic_officers (officer_id, last_name, first_name, middle_name, position_name) FROM stdin;
+1	Фёдоров	Андрей	Викторович	инспектор регистрационно-экзаменационного отдела
+2	Белова	Ольга	Дмитриевна	старший инспектор
+3	Громов	Николай	Петрович	специалист по выдаче удостоверений
+4	Соколова	Мария	Игоревна	инспектор регистрационно-экзаменационного отдела
+5	Егоров	Владислав	Андреевич	старший инспектор
+6	Непоткупнов	Константин	Сергеевич	специалист по выдаче удостоверений
+\.
+
+
+--
+-- TOC entry 6247 (class 0 OID 0)
+-- Dependencies: 613
+-- Name: app_users_user_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.app_users_user_id_seq', 6, true);
+
+
+--
+-- TOC entry 6248 (class 0 OID 0)
+-- Dependencies: 1002
+-- Name: audit_log_log_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.audit_log_log_id_seq', 14, true);
+
+
+--
+-- TOC entry 6249 (class 0 OID 0)
+-- Dependencies: 615
+-- Name: drivers_driver_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.drivers_driver_id_seq', 11, true);
+
+
+--
+-- TOC entry 6250 (class 0 OID 0)
+-- Dependencies: 609
+-- Name: driving_schools_school_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.driving_schools_school_id_seq', 6, true);
+
+
+--
+-- TOC entry 6251 (class 0 OID 0)
+-- Dependencies: 617
+-- Name: exam_routes_route_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.exam_routes_route_id_seq', 5, true);
+
+
+--
+-- TOC entry 6252 (class 0 OID 0)
+-- Dependencies: 623
+-- Name: exams_exam_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.exams_exam_id_seq', 12, true);
+
+
+--
+-- TOC entry 6253 (class 0 OID 0)
+-- Dependencies: 611
+-- Name: instructors_instructor_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.instructors_instructor_id_seq', 9, true);
+
+
+--
+-- TOC entry 6254 (class 0 OID 0)
+-- Dependencies: 625
+-- Name: licenses_license_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.licenses_license_id_seq', 8, true);
+
+
+--
+-- TOC entry 6255 (class 0 OID 0)
+-- Dependencies: 619
+-- Name: traffic_inspectors_inspector_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.traffic_inspectors_inspector_id_seq', 5, true);
+
+
+--
+-- TOC entry 6256 (class 0 OID 0)
+-- Dependencies: 621
+-- Name: traffic_officers_officer_id_seq; Type: SEQUENCE SET; Schema: akulova_vs; Owner: akulova_vs
+--
+
+SELECT pg_catalog.setval('akulova_vs.traffic_officers_officer_id_seq', 7, true);
+
+
+--
+-- TOC entry 5963 (class 2606 OID 450092)
+-- Name: app_users app_users_driver_id_key; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.app_users
+    ADD CONSTRAINT app_users_driver_id_key UNIQUE (driver_id);
+
+
+--
+-- TOC entry 5965 (class 2606 OID 448337)
+-- Name: app_users app_users_instructor_id_key; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.app_users
+    ADD CONSTRAINT app_users_instructor_id_key UNIQUE (instructor_id);
+
+
+--
+-- TOC entry 5967 (class 2606 OID 448335)
+-- Name: app_users app_users_login_key; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.app_users
+    ADD CONSTRAINT app_users_login_key UNIQUE (login);
+
+
+--
+-- TOC entry 5969 (class 2606 OID 448333)
+-- Name: app_users app_users_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.app_users
+    ADD CONSTRAINT app_users_pkey PRIMARY KEY (user_id);
+
+
+--
+-- TOC entry 5985 (class 2606 OID 454363)
+-- Name: audit_log audit_log_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.audit_log
+    ADD CONSTRAINT audit_log_pkey PRIMARY KEY (log_id);
+
+
+--
+-- TOC entry 5971 (class 2606 OID 448353)
+-- Name: drivers drivers_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.drivers
+    ADD CONSTRAINT drivers_pkey PRIMARY KEY (driver_id);
+
+
+--
+-- TOC entry 5957 (class 2606 OID 448303)
+-- Name: driving_schools driving_schools_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.driving_schools
+    ADD CONSTRAINT driving_schools_pkey PRIMARY KEY (school_id);
+
+
+--
+-- TOC entry 5973 (class 2606 OID 448371)
+-- Name: exam_routes exam_routes_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.exam_routes
+    ADD CONSTRAINT exam_routes_pkey PRIMARY KEY (route_id);
+
+
+--
+-- TOC entry 5979 (class 2606 OID 448403)
+-- Name: exams exams_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.exams
+    ADD CONSTRAINT exams_pkey PRIMARY KEY (exam_id);
+
+
+--
+-- TOC entry 5959 (class 2606 OID 448314)
+-- Name: instructors instructors_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.instructors
+    ADD CONSTRAINT instructors_pkey PRIMARY KEY (instructor_id);
+
+
+--
+-- TOC entry 5981 (class 2606 OID 448430)
+-- Name: licenses licenses_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.licenses
+    ADD CONSTRAINT licenses_pkey PRIMARY KEY (license_id);
+
+
+--
+-- TOC entry 5975 (class 2606 OID 448381)
+-- Name: traffic_inspectors traffic_inspectors_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.traffic_inspectors
+    ADD CONSTRAINT traffic_inspectors_pkey PRIMARY KEY (inspector_id);
+
+
+--
+-- TOC entry 5977 (class 2606 OID 448391)
+-- Name: traffic_officers traffic_officers_pkey; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.traffic_officers
+    ADD CONSTRAINT traffic_officers_pkey PRIMARY KEY (officer_id);
+
+
+--
+-- TOC entry 5961 (class 2606 OID 454339)
+-- Name: instructors uq_instructors_license_number; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.instructors
+    ADD CONSTRAINT uq_instructors_license_number UNIQUE (license_number);
+
+
+--
+-- TOC entry 5983 (class 2606 OID 454341)
+-- Name: licenses uq_licenses_license_number; Type: CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.licenses
+    ADD CONSTRAINT uq_licenses_license_number UNIQUE (license_number);
+
+
+--
+-- TOC entry 5997 (class 2620 OID 454377)
+-- Name: app_users trg_audit_app_users; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_app_users AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.app_users FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('user_id');
+
+
+--
+-- TOC entry 5998 (class 2620 OID 454371)
+-- Name: drivers trg_audit_drivers; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_drivers AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.drivers FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('driver_id');
+
+
+--
+-- TOC entry 5995 (class 2620 OID 454369)
+-- Name: driving_schools trg_audit_driving_schools; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_driving_schools AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.driving_schools FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('school_id');
+
+
+--
+-- TOC entry 5999 (class 2620 OID 454372)
+-- Name: exam_routes trg_audit_exam_routes; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_exam_routes AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.exam_routes FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('route_id');
+
+
+--
+-- TOC entry 6002 (class 2620 OID 454375)
+-- Name: exams trg_audit_exams; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_exams AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.exams FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('exam_id');
+
+
+--
+-- TOC entry 5996 (class 2620 OID 454370)
+-- Name: instructors trg_audit_instructors; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_instructors AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.instructors FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('instructor_id');
+
+
+--
+-- TOC entry 6003 (class 2620 OID 454376)
+-- Name: licenses trg_audit_licenses; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_licenses AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.licenses FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('license_id');
+
+
+--
+-- TOC entry 6000 (class 2620 OID 454373)
+-- Name: traffic_inspectors trg_audit_traffic_inspectors; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_traffic_inspectors AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.traffic_inspectors FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('inspector_id');
+
+
+--
+-- TOC entry 6001 (class 2620 OID 454374)
+-- Name: traffic_officers trg_audit_traffic_officers; Type: TRIGGER; Schema: akulova_vs; Owner: akulova_vs
+--
+
+CREATE TRIGGER trg_audit_traffic_officers AFTER INSERT OR DELETE OR UPDATE ON akulova_vs.traffic_officers FOR EACH ROW EXECUTE FUNCTION akulova_vs.fn_audit_log_changes('officer_id');
+
+
+--
+-- TOC entry 5987 (class 2606 OID 450086)
+-- Name: app_users app_users_driver_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.app_users
+    ADD CONSTRAINT app_users_driver_id_fkey FOREIGN KEY (driver_id) REFERENCES akulova_vs.drivers(driver_id) ON UPDATE CASCADE ON DELETE RESTRICT;
+
+
+--
+-- TOC entry 5988 (class 2606 OID 448338)
+-- Name: app_users app_users_instructor_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.app_users
+    ADD CONSTRAINT app_users_instructor_id_fkey FOREIGN KEY (instructor_id) REFERENCES akulova_vs.instructors(instructor_id);
+
+
+--
+-- TOC entry 5989 (class 2606 OID 448354)
+-- Name: drivers drivers_school_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.drivers
+    ADD CONSTRAINT drivers_school_id_fkey FOREIGN KEY (school_id) REFERENCES akulova_vs.driving_schools(school_id);
+
+
+--
+-- TOC entry 5990 (class 2606 OID 448404)
+-- Name: exams exams_driver_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.exams
+    ADD CONSTRAINT exams_driver_id_fkey FOREIGN KEY (driver_id) REFERENCES akulova_vs.drivers(driver_id);
+
+
+--
+-- TOC entry 5991 (class 2606 OID 448414)
+-- Name: exams exams_inspector_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.exams
+    ADD CONSTRAINT exams_inspector_id_fkey FOREIGN KEY (inspector_id) REFERENCES akulova_vs.traffic_inspectors(inspector_id);
+
+
+--
+-- TOC entry 5992 (class 2606 OID 448409)
+-- Name: exams exams_route_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.exams
+    ADD CONSTRAINT exams_route_id_fkey FOREIGN KEY (route_id) REFERENCES akulova_vs.exam_routes(route_id);
+
+
+--
+-- TOC entry 5986 (class 2606 OID 448315)
+-- Name: instructors instructors_school_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.instructors
+    ADD CONSTRAINT instructors_school_id_fkey FOREIGN KEY (school_id) REFERENCES akulova_vs.driving_schools(school_id);
+
+
+--
+-- TOC entry 5993 (class 2606 OID 448431)
+-- Name: licenses licenses_driver_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.licenses
+    ADD CONSTRAINT licenses_driver_id_fkey FOREIGN KEY (driver_id) REFERENCES akulova_vs.drivers(driver_id);
+
+
+--
+-- TOC entry 5994 (class 2606 OID 448436)
+-- Name: licenses licenses_officer_id_fkey; Type: FK CONSTRAINT; Schema: akulova_vs; Owner: akulova_vs
+--
+
+ALTER TABLE ONLY akulova_vs.licenses
+    ADD CONSTRAINT licenses_officer_id_fkey FOREIGN KEY (officer_id) REFERENCES akulova_vs.traffic_officers(officer_id);
+
+
+-- Completed on 2026-06-02 17:20:16
+
+--
+-- PostgreSQL database dump complete
+--
+
+\unrestrict wUhTUEtP7H3sZbn0Sj8yBWOgI7rW8eGIJqHJvYsaK1avC0CCtslcJ40NJgPs7Rm
+