Skip to content

Commit fb3e9db

Browse files
Merge pull request #31 from adela-bytebase/adela-bytebase-patch-27
Create initial database schema with tables and triggers
2 parents 3ceb5f5 + cb9a8b0 commit fb3e9db

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

schema/schema.sql

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
COMMENT ON SCHEMA "public" IS 'standard public schema';
2+
3+
CREATE TABLE "public"."audit" (
4+
"id" serial,
5+
"operation" text NOT NULL,
6+
"query" text,
7+
"user_name" text NOT NULL,
8+
"changed_at" timestamp(6) with time zone DEFAULT CURRENT_TIMESTAMP,
9+
CONSTRAINT "audit_pkey" PRIMARY KEY (id)
10+
);
11+
12+
CREATE INDEX "idx_audit_changed_at" ON ONLY "public"."audit" (changed_at);
13+
14+
CREATE INDEX "idx_audit_operation" ON ONLY "public"."audit" (operation);
15+
16+
CREATE INDEX "idx_audit_username" ON ONLY "public"."audit" (user_name);
17+
18+
CREATE TABLE "public"."department" (
19+
"dept_no" text NOT NULL,
20+
"dept_name" text NOT NULL,
21+
CONSTRAINT "department_pkey" PRIMARY KEY (dept_no),
22+
CONSTRAINT "department_dept_name_key" UNIQUE (dept_name)
23+
);
24+
25+
CREATE TABLE "public"."dept_emp" (
26+
"emp_no" integer NOT NULL,
27+
"dept_no" text NOT NULL,
28+
"from_date" date NOT NULL,
29+
"to_date" date NOT NULL,
30+
CONSTRAINT "dept_emp_pkey" PRIMARY KEY (emp_no, dept_no),
31+
CONSTRAINT "dept_emp_dept_no_fkey" FOREIGN KEY ("dept_no") REFERENCES "public"."department" ("dept_no") ON DELETE CASCADE,
32+
CONSTRAINT "dept_emp_emp_no_fkey" FOREIGN KEY ("emp_no") REFERENCES "public"."employee" ("emp_no") ON DELETE CASCADE
33+
);
34+
35+
CREATE TABLE "public"."dept_manager" (
36+
"emp_no" integer NOT NULL,
37+
"dept_no" text NOT NULL,
38+
"from_date" date NOT NULL,
39+
"to_date" date NOT NULL,
40+
CONSTRAINT "dept_manager_pkey" PRIMARY KEY (emp_no, dept_no),
41+
CONSTRAINT "dept_manager_dept_no_fkey" FOREIGN KEY ("dept_no") REFERENCES "public"."department" ("dept_no") ON DELETE CASCADE,
42+
CONSTRAINT "dept_manager_emp_no_fkey" FOREIGN KEY ("emp_no") REFERENCES "public"."employee" ("emp_no") ON DELETE CASCADE
43+
);
44+
45+
CREATE TABLE "public"."employee" (
46+
"emp_no" serial,
47+
"birth_date" date NOT NULL,
48+
"first_name" text NOT NULL,
49+
"last_name" text NOT NULL,
50+
"gender" text NOT NULL,
51+
"hire_date" date NOT NULL,
52+
CONSTRAINT "employee_pkey" PRIMARY KEY (emp_no),
53+
CONSTRAINT "employee_gender_check" CHECK (gender = ANY (ARRAY['M'::text, 'F'::text]))
54+
);
55+
56+
CREATE INDEX "idx_employee_hire_date" ON ONLY "public"."employee" (hire_date);
57+
58+
CREATE TABLE "public"."salary" (
59+
"emp_no" integer NOT NULL,
60+
"amount" integer NOT NULL,
61+
"from_date" date NOT NULL,
62+
"to_date" date NOT NULL,
63+
CONSTRAINT "salary_pkey" PRIMARY KEY (emp_no, from_date),
64+
CONSTRAINT "salary_emp_no_fkey" FOREIGN KEY ("emp_no") REFERENCES "public"."employee" ("emp_no") ON DELETE CASCADE
65+
);
66+
67+
CREATE INDEX "idx_salary_amount" ON ONLY "public"."salary" (amount);
68+
69+
CREATE TRIGGER salary_log_trigger AFTER DELETE OR UPDATE ON public.salary FOR EACH ROW EXECUTE FUNCTION public.log_dml_operations();
70+
71+
CREATE TABLE "public"."t0" (
72+
"id" serial,
73+
"username" text NOT NULL,
74+
CONSTRAINT "t0_pkey" PRIMARY KEY (id)
75+
);
76+
77+
CREATE TABLE "public"."title" (
78+
"emp_no" integer NOT NULL,
79+
"title" text NOT NULL,
80+
"from_date" date NOT NULL,
81+
"to_date" date,
82+
CONSTRAINT "title_pkey" PRIMARY KEY (emp_no, title, from_date),
83+
CONSTRAINT "title_emp_no_fkey" FOREIGN KEY ("emp_no") REFERENCES "public"."employee" ("emp_no") ON DELETE CASCADE
84+
);
85+
86+
CREATE VIEW "public"."current_dept_emp" AS SELECT l.emp_no,
87+
d.dept_no,
88+
l.from_date,
89+
l.to_date
90+
FROM (public.dept_emp d
91+
JOIN public.dept_emp_latest_date l ON (((d.emp_no = l.emp_no) AND (d.from_date = l.from_date) AND (l.to_date = d.to_date))));
92+
93+
CREATE VIEW "public"."dept_emp_latest_date" AS SELECT emp_no,
94+
max(from_date) AS from_date,
95+
max(to_date) AS to_date
96+
FROM public.dept_emp
97+
GROUP BY emp_no;
98+
99+
CREATE OR REPLACE FUNCTION public.log_dml_operations()
100+
RETURNS trigger
101+
LANGUAGE plpgsql
102+
AS $function$
103+
BEGIN
104+
IF (TG_OP = 'INSERT') THEN
105+
INSERT INTO audit (operation, query, user_name)
106+
VALUES ('INSERT', current_query(), current_user);
107+
RETURN NEW;
108+
ELSIF (TG_OP = 'UPDATE') THEN
109+
INSERT INTO audit (operation, query, user_name)
110+
VALUES ('UPDATE', current_query(), current_user);
111+
RETURN NEW;
112+
ELSIF (TG_OP = 'DELETE') THEN
113+
INSERT INTO audit (operation, query, user_name)
114+
VALUES ('DELETE', current_query(), current_user);
115+
RETURN OLD;
116+
END IF;
117+
RETURN NULL;
118+
END;
119+
$function$;
120+

0 commit comments

Comments
 (0)