-- Wedding Guest List Database Schema -- PostgreSQL Database Setup Script -- ============================================ -- STEP 1: Create Database User -- ============================================ -- Create a dedicated user for the wedding guest list application -- Change the password to something secure! CREATE USER wedding_admin WITH PASSWORD 'your_secure_password_here'; -- Grant user the ability to create databases (optional) ALTER USER wedding_admin CREATEDB; -- ============================================ -- STEP 2: Create Database -- ============================================ -- Create the wedding guests database CREATE DATABASE wedding_guests WITH OWNER = wedding_admin ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0; -- Connect to the new database \c wedding_guests -- ============================================ -- STEP 3: Grant Schema Privileges -- ============================================ -- Grant all privileges on the public schema to the user GRANT ALL PRIVILEGES ON SCHEMA public TO wedding_admin; -- Grant privileges on all current and future tables GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO wedding_admin; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO wedding_admin; -- Ensure the user has privileges on future objects ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO wedding_admin; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO wedding_admin; -- ============================================ -- STEP 4: Create Tables -- ============================================ -- Guests table CREATE TABLE IF NOT EXISTS guests ( id SERIAL PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, phone_number VARCHAR(50), rsvp_status VARCHAR(20) DEFAULT 'pending' CHECK (rsvp_status IN ('pending', 'accepted', 'declined')), meal_preference VARCHAR(50), has_plus_one BOOLEAN DEFAULT FALSE, plus_one_name VARCHAR(200), owner VARCHAR(50), notes TEXT, table_number INTEGER, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE ); -- Create indexes for better query performance CREATE INDEX idx_guests_email ON guests(email); CREATE INDEX idx_guests_rsvp_status ON guests(rsvp_status); CREATE INDEX idx_guests_last_name ON guests(last_name); CREATE INDEX idx_guests_owner ON guests(owner); -- Create a trigger to automatically update the updated_at timestamp CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; CREATE TRIGGER update_guests_updated_at BEFORE UPDATE ON guests FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- Grant table ownership to wedding_admin ALTER TABLE guests OWNER TO wedding_admin; -- ============================================ -- STEP 5: Insert Sample Data (Optional) -- ============================================ -- Uncomment the lines below to insert sample guests for testing -- INSERT INTO guests (first_name, last_name, email, phone_number, rsvp_status, meal_preference, has_plus_one) -- VALUES -- ('John', 'Doe', 'john.doe@example.com', '+1-555-0101', 'accepted', 'vegetarian', TRUE), -- ('Jane', 'Smith', 'jane.smith@example.com', '+1-555-0102', 'pending', 'vegan', FALSE), -- ('Bob', 'Johnson', 'bob.j@example.com', '+1-555-0103', 'accepted', 'gluten-free', TRUE), -- ('Alice', 'Williams', 'alice.w@example.com', '+1-555-0104', 'declined', NULL, FALSE); -- ============================================ -- Verification Query -- ============================================ -- Run this to verify the setup SELECT 'Database setup completed successfully!' AS status; SELECT COUNT(*) AS total_guests FROM guests;