Skip to content

Commit 82385c1

Browse files
authored
chore: use exported schema (#51)
1 parent 8f89fe3 commit 82385c1

File tree

3 files changed

+114
-97
lines changed

3 files changed

+114
-97
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: SQL review on pull request with declarative release using bytebase-action image
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
paths:
8+
- "schema/*.sql"
9+
10+
jobs:
11+
check-release-on-prod:
12+
permissions:
13+
pull-requests: write # write permission required to allow the action writes the check results to the comment.
14+
runs-on: ubuntu-latest # use self-hosted machines if your Bytebase runs in internal networks.
15+
container:
16+
image: bytebase/bytebase-action:latest
17+
steps:
18+
- name: Checkout
19+
uses: actions/checkout@v4
20+
- name: Check release
21+
env:
22+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # set GITHUB_TOKEN because the 'Check release' step needs it to comment the pull request with check results.
23+
BYTEBASE_URL: https://demo.bytebase.com
24+
BYTEBASE_SERVICE_ACCOUNT: [email protected] # set service account via environment variable
25+
BYTEBASE_SERVICE_ACCOUNT_SECRET: ${{ secrets.BYTEBASE_SERVICE_ACCOUNT_SECRET }} # set service account secret via environment variable
26+
BYTEBASE_PROJECT: "projects/hr"
27+
BYTEBASE_TARGETS: "instances/prod-sample-instance/databases/hr_prod"
28+
FILE_PATTERN: "schema/*.sql"
29+
run: |
30+
bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} --declarative

schema/schema.sql

Lines changed: 84 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,112 @@
1-
CREATE TABLE public.employee (
2-
emp_no SERIAL NOT NULL,
3-
birth_date DATE NOT NULL,
4-
first_name TEXT NOT NULL,
5-
last_name TEXT NOT NULL,
6-
gender TEXT NOT NULL CHECK (gender IN('M', 'F')) NOT NULL,
7-
hire_date DATE NOT NULL,
8-
PRIMARY KEY (emp_no)
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)
910
);
1011

11-
CREATE INDEX idx_employee_hire_date ON public.employee (hire_date);
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+
);
1224

13-
CREATE TABLE public.department (
14-
dept_no TEXT NOT NULL,
15-
dept_name TEXT NOT NULL,
16-
PRIMARY KEY (dept_no),
17-
UNIQUE (dept_name)
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
1833
);
1934

20-
CREATE TABLE public.dept_manager (
21-
emp_no INT NOT NULL,
22-
dept_no TEXT NOT NULL,
23-
from_date DATE NOT NULL,
24-
to_date DATE NOT NULL,
25-
FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
26-
FOREIGN KEY (dept_no) REFERENCES department (dept_no) ON DELETE CASCADE,
27-
PRIMARY KEY (emp_no, dept_no)
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
2843
);
2944

30-
CREATE TABLE public.dept_emp (
31-
emp_no INT NOT NULL,
32-
dept_no TEXT NOT NULL,
33-
from_date DATE NOT NULL,
34-
to_date DATE NOT NULL,
35-
FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
36-
FOREIGN KEY (dept_no) REFERENCES department (dept_no) ON DELETE CASCADE,
37-
PRIMARY KEY (emp_no, dept_no)
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]))
3854
);
3955

40-
CREATE TABLE public.title (
41-
emp_no INT NOT NULL,
42-
title TEXT NOT NULL,
43-
from_date DATE NOT NULL,
44-
to_date DATE,
45-
FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
46-
PRIMARY KEY (emp_no, title, from_date)
47-
);
48-
49-
CREATE TABLE public.salary (
50-
emp_no INT NOT NULL,
51-
amount INT NOT NULL,
52-
from_date DATE NOT NULL,
53-
to_date DATE NOT NULL,
54-
FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
55-
PRIMARY KEY (emp_no, from_date)
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
5665
);
5766

58-
CREATE INDEX idx_salary_amount ON public.salary (amount);
67+
CREATE INDEX "idx_salary_amount" ON ONLY "public"."salary" (amount);
5968

60-
CREATE TABLE public.audit (
61-
id SERIAL PRIMARY KEY,
62-
operation TEXT NOT NULL,
63-
query TEXT,
64-
user_name TEXT NOT NULL,
65-
changed_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
69+
CREATE TABLE "public"."title" (
70+
"emp_no" integer NOT NULL,
71+
"title" text NOT NULL,
72+
"from_date" date NOT NULL,
73+
"to_date" date,
74+
CONSTRAINT "title_pkey" PRIMARY KEY (emp_no, title, from_date),
75+
CONSTRAINT "title_emp_no_fkey" FOREIGN KEY ("emp_no") REFERENCES "public"."employee" ("emp_no") ON DELETE CASCADE
6676
);
6777

68-
CREATE INDEX idx_audit_operation ON public.audit (operation);
69-
CREATE INDEX idx_audit_username ON public.audit (user_name);
70-
CREATE INDEX idx_audit_changed_at ON public.audit (changed_at);
78+
CREATE VIEW "public"."current_dept_emp" AS SELECT l.emp_no,
79+
d.dept_no,
80+
l.from_date,
81+
l.to_date
82+
FROM (public.dept_emp d
83+
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))));
7184

72-
CREATE OR REPLACE FUNCTION public.log_dml_operations() RETURNS TRIGGER AS $$
85+
CREATE VIEW "public"."dept_emp_latest_date" AS SELECT emp_no,
86+
max(from_date) AS from_date,
87+
max(to_date) AS to_date
88+
FROM public.dept_emp
89+
GROUP BY emp_no;
90+
91+
CREATE OR REPLACE FUNCTION public.log_dml_operations()
92+
RETURNS trigger
93+
LANGUAGE plpgsql
94+
AS $function$
7395
BEGIN
7496
IF (TG_OP = 'INSERT') THEN
75-
INSERT INTO public.audit (operation, query, user_name)
97+
INSERT INTO audit (operation, query, user_name)
7698
VALUES ('INSERT', current_query(), current_user);
7799
RETURN NEW;
78100
ELSIF (TG_OP = 'UPDATE') THEN
79-
INSERT INTO public.audit (operation, query, user_name)
101+
INSERT INTO audit (operation, query, user_name)
80102
VALUES ('UPDATE', current_query(), current_user);
81103
RETURN NEW;
82104
ELSIF (TG_OP = 'DELETE') THEN
83-
INSERT INTO public.audit (operation, query, user_name)
105+
INSERT INTO audit (operation, query, user_name)
84106
VALUES ('DELETE', current_query(), current_user);
85107
RETURN OLD;
86108
END IF;
87109
RETURN NULL;
88110
END;
89-
$$ LANGUAGE plpgsql;
90-
91-
-- only log update and delete, otherwise, it will cause too much change.
92-
CREATE TRIGGER salary_log_trigger
93-
AFTER UPDATE OR DELETE ON public.salary
94-
FOR EACH ROW
95-
EXECUTE FUNCTION public.log_dml_operations();
96-
97-
CREATE OR REPLACE VIEW public.dept_emp_latest_date AS
98-
SELECT
99-
emp_no,
100-
MAX(
101-
from_date) AS from_date,
102-
MAX(
103-
to_date) AS to_date
104-
FROM
105-
public.dept_emp
106-
GROUP BY
107-
emp_no;
108-
109-
-- shows only the current department for each employee
110-
CREATE OR REPLACE VIEW public.current_dept_emp AS
111-
SELECT
112-
l.emp_no,
113-
dept_no,
114-
l.from_date,
115-
l.to_date
116-
FROM
117-
public.dept_emp d
118-
INNER JOIN public.dept_emp_latest_date l ON d.emp_no = l.emp_no
119-
AND d.from_date = l.from_date
120-
AND l.to_date = d.to_date;
111+
$function$;
112+

schema/users.sql

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)