diff --git a/src/main/sql/migrate0.sql b/src/main/sql/migrate0.sql index 202bb68..2ed145d 100644 --- a/src/main/sql/migrate0.sql +++ b/src/main/sql/migrate0.sql @@ -1,87 +1,29 @@ +-- run these as postgres + +-- Create the user 'minhtran' if it does not exist +DO +$$ + BEGIN + IF NOT EXISTS (SELECT + FROM pg_catalog.pg_roles + WHERE rolname = 'minhtran') THEN + CREATE ROLE minhtran LOGIN PASSWORD 'password'; + END IF; + END +$$; + +-- Terminate all connections to the database +REVOKE CONNECT ON DATABASE assignment1 FROM PUBLIC; +SELECT pg_terminate_backend(pg_stat_activity.pid) +FROM pg_stat_activity +WHERE pg_stat_activity.datname = 'assignment1' + AND pid <> pg_backend_pid(); + +-- Drop the database +DROP DATABASE IF EXISTS "assignment1"; + +-- Create the new database CREATE DATABASE "assignment1"; -CREATE SCHEMA IF NOT EXISTS "assignment 1"; - -CREATE DOMAIN canada_postal_code AS VARCHAR(7) - CHECK (VALUE ~ '^[A-Z]\d[A-Z]\s?\d[A-Z]\d$'); - -CREATE TYPE canadian_province AS ENUM ( - 'AB', -- Alberta - 'BC', -- British Columbia - 'MB', -- Manitoba - 'NB', -- New Brunswick - 'NL', -- Newfoundland and Labrador - 'NS', -- Nova Scotia - 'NT', -- Northwest Territories - 'NU', -- Nunavut - 'ON', -- Ontario - 'PE', -- Prince Edward Island - 'QC', -- Quebec - 'SK', -- Saskatchewan - 'YT' -- Yukon - ); - -CREATE TABLE "assignment 1".Donors -( - donorID INT NOT NULL, - firstName VARCHAR(50) NOT NULL, - lastName VARCHAR(50) NOT NULL, - middleInitial CHAR(1), - dateOfBirth DATE, - address VARCHAR(100), - city VARCHAR(50), - postalCode canada_postal_code, - province canadian_province, - gender CHAR(1), - SSN VARCHAR(11), - hobby VARCHAR(100), - phone VARCHAR(15), - email VARCHAR(100), - CONSTRAINT donors_pk PRIMARY KEY (donorID), - CONSTRAINT valid_canada_postal_code CHECK (postalCode ~ '^[A-Z]\d[A-Z]\s?\d[A-Z]\d$'), - CONSTRAINT valid_gender CHECK (gender IN ('M', 'F', 'O')), - CONSTRAINT valid_ssn CHECK (SSN ~ '^\d{3}-\d{3}-\d{3}$'), - CONSTRAINT valid_email CHECK (email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$') -); - -CREATE TABLE "assignment 1".Donations -( - dID INT NOT NULL, - donorID INT NOT NULL, - date DATE NOT NULL, - type VARCHAR(7) NOT NULL, - amount DECIMAL(10, 2) NOT NULL, - CONSTRAINT donations_pk PRIMARY KEY (dID), - CONSTRAINT donations_donorID_fk FOREIGN KEY (donorID) REFERENCES "assignment 1".Donors (donorID), - CONSTRAINT valid_donation_type CHECK (type IN ('money', 'product')) -); - -create table "assignment 1".Products -( - pID INT NOT NULL, - description varchar(100), - date DATE NOT NULL, - price DECIMAL(10, 2) NOT NULL, - weight DECIMAL(5, 2) NOT NULL, - CONSTRAINT products_pk PRIMARY KEY (pID) -); - -CREATE TABLE "assignment 1".Sales -( - sID INT NOT NULL, - date DATE NOT NULL, - amount DECIMAL(10, 2) NOT NULL, - totalWeight DECIMAL(10, 2) NOT NULL, - deliveryFee DECIMAL(10, 2) DEFAULT 0 NOT NULL, - CONSTRAINT sales_pk primary key (sID), - CONSTRAINT valid_delivery_fee CHECK (deliveryFee >= 0) -); - -CREATE TABLE "assignment 1".SalesItems -( - sID INT NOT NULL, - pID INT NOT NULL, - PRIMARY KEY (sID, pID), - FOREIGN KEY (sID) REFERENCES "assignment 1".Sales (sID), - FOREIGN KEY (pID) REFERENCES "assignment 1".Products (pID) -); \ No newline at end of file +-- Grant all privileges on the new database to 'minhtran' +GRANT ALL PRIVILEGES ON DATABASE "assignment1" TO minhtran; diff --git a/src/main/sql/migrate1.sql b/src/main/sql/migrate1.sql new file mode 100644 index 0000000..f7a06e0 --- /dev/null +++ b/src/main/sql/migrate1.sql @@ -0,0 +1,94 @@ +-- Run this as minh tran user + +-- Create the schema if it doesn't exist +CREATE SCHEMA IF NOT EXISTS "assignment 1"; + +-- Drop the domain canada_postal_code if it exists +DROP DOMAIN IF EXISTS canada_postal_code; + +-- Drop the type canadian_province if it exists +DROP TYPE IF EXISTS canadian_province; + +CREATE DOMAIN canada_postal_code AS VARCHAR(7) + CHECK (VALUE ~ '^[A-Z]\d[A-Z]\s?\d[A-Z]\d$'); + +CREATE TYPE canadian_province AS ENUM ( + 'AB', -- Alberta + 'BC', -- British Columbia + 'MB', -- Manitoba + 'NB', -- New Brunswick + 'NL', -- Newfoundland and Labrador + 'NS', -- Nova Scotia + 'NT', -- Northwest Territories + 'NU', -- Nunavut + 'ON', -- Ontario + 'PE', -- Prince Edward Island + 'QC', -- Quebec + 'SK', -- Saskatchewan + 'YT' -- Yukon + ); + +CREATE TABLE "assignment 1".Donors +( + donorID INT NOT NULL, + firstName VARCHAR(50) NOT NULL, + lastName VARCHAR(50) NOT NULL, + middleInitial CHAR(1), + dateOfBirth DATE, + address VARCHAR(100), + city VARCHAR(50), + postalCode canada_postal_code, + province canadian_province, + gender CHAR(1), + SSN VARCHAR(11), + hobby VARCHAR(100), + phone VARCHAR(15), + email VARCHAR(100), + CONSTRAINT donors_pk PRIMARY KEY (donorID), + CONSTRAINT valid_canada_postal_code CHECK (postalCode ~ '^[A-Z]\d[A-Z]\s?\d[A-Z]\d$'), + CONSTRAINT valid_gender CHECK (gender IN ('M', 'F', 'O')), + CONSTRAINT valid_ssn CHECK (SSN ~ '^\d{3}-\d{3}-\d{3}$'), + CONSTRAINT valid_email CHECK (email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$') +); + +CREATE TABLE "assignment 1".Donations +( + dID INT NOT NULL, + donorID INT NOT NULL, + date DATE NOT NULL, + type VARCHAR(7) NOT NULL, + amount DECIMAL(10, 2) NOT NULL, + CONSTRAINT donations_pk PRIMARY KEY (dID), + CONSTRAINT donations_donorID_fk FOREIGN KEY (donorID) REFERENCES "assignment 1".Donors (donorID), + CONSTRAINT valid_donation_type CHECK (type IN ('money', 'product')) +); + +create table "assignment 1".Products +( + pID INT NOT NULL, + description varchar(100), + date DATE NOT NULL, + price DECIMAL(10, 2) NOT NULL, + weight DECIMAL(5, 2) NOT NULL, + CONSTRAINT products_pk PRIMARY KEY (pID) +); + +CREATE TABLE "assignment 1".Sales +( + sID INT NOT NULL, + date DATE NOT NULL, + amount DECIMAL(10, 2) NOT NULL, + totalWeight DECIMAL(10, 2) NOT NULL, + deliveryFee DECIMAL(10, 2) DEFAULT 0 NOT NULL, + CONSTRAINT sales_pk primary key (sID), + CONSTRAINT valid_delivery_fee CHECK (deliveryFee >= 0) +); + +CREATE TABLE "assignment 1".SalesItems +( + sID INT NOT NULL, + pID INT NOT NULL, + PRIMARY KEY (sID, pID), + FOREIGN KEY (sID) REFERENCES "assignment 1".Sales (sID), + FOREIGN KEY (pID) REFERENCES "assignment 1".Products (pID) +);