11-- Deploy: rls-demo to pg
22-- made with <3 @ launchql.com
33
4-
54-- Create rls_test schema
65CREATE SCHEMA IF NOT EXISTS rls_test;
76
87-- Create users table
9- CREATE TABLE IF NOT EXISTS rls_test .user_profiles (
8+ CREATE TABLE IF NOT EXISTS rls_test .pets (
109 id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
11- email TEXT UNIQUE NOT NULL ,
10+
11+ -- owner_id is the user_id of the user who owns the pet
12+ user_id UUID NOT NULL REFERENCES auth .users (id) ON DELETE CASCADE ,
13+
14+ -- name is the name of the pet
1215 name TEXT NOT NULL ,
13- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
14- updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
15- );
16+ -- breed is the breed of the pet
17+ breed TEXT NOT NULL ,
1618
17- -- Create products table with owner_id foreign key
18- CREATE TABLE IF NOT EXISTS rls_test .products (
19- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
20- name TEXT NOT NULL ,
21- description TEXT ,
22- price DECIMAL (10 ,2 ) NOT NULL ,
23- owner_id UUID NOT NULL REFERENCES rls_test .user_profiles (id) ON DELETE CASCADE ,
2419 created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
2520 updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
2621);
2722
2823-- Enable RLS on both tables
29- ALTER TABLE rls_test .user_profiles ENABLE ROW LEVEL SECURITY;
30- ALTER TABLE rls_test .products ENABLE ROW LEVEL SECURITY;
24+ ALTER TABLE rls_test .pets ENABLE ROW LEVEL SECURITY;
3125
3226-- Create RLS policies for users table
3327-- Users can view their own data
34- CREATE POLICY " Users can view own data" ON rls_test .user_profiles
35- FOR SELECT USING (auth .uid () = id );
28+ CREATE POLICY " Users can view own data" ON rls_test .pets
29+ FOR SELECT USING (auth .uid () = user_id );
3630
3731-- Users can update their own data
38- CREATE POLICY " Users can update own data" ON rls_test .user_profiles
39- FOR UPDATE USING (auth .uid () = id );
32+ CREATE POLICY " Users can update own data" ON rls_test .pets
33+ FOR UPDATE USING (auth .uid () = user_id );
4034
4135-- Users can insert their own data
42- CREATE POLICY " Users can insert own data" ON rls_test .user_profiles
43- FOR INSERT WITH CHECK (true );
36+ CREATE POLICY " Users can insert own data" ON rls_test .pets
37+ FOR INSERT WITH CHECK (auth . uid () = user_id );
4438
4539-- Users can delete their own data
46- CREATE POLICY " Users can delete own data" ON rls_test .user_profiles
47- FOR DELETE USING (auth .uid () = id);
48-
49- -- Create RLS policies for products table
50- -- Users can view products they own
51- CREATE POLICY " Users can view own products" ON rls_test .products
52- FOR SELECT USING (auth .uid () = owner_id);
53-
54- -- Users can insert products they own
55- CREATE POLICY " Users can insert own products" ON rls_test .products
56- FOR INSERT WITH CHECK (auth .uid () = owner_id);
57-
58- -- Users can update products they own
59- CREATE POLICY " Users can update own products" ON rls_test .products
60- FOR UPDATE USING (auth .uid () = owner_id);
61-
62- -- Users can delete products they own
63- CREATE POLICY " Users can delete own products" ON rls_test .products
64- FOR DELETE USING (auth .uid () = owner_id);
40+ CREATE POLICY " Users can delete own data" ON rls_test .pets
41+ FOR DELETE USING (auth .uid () = user_id);
6542
6643-- Grant permissions to anon users
6744GRANT USAGE ON SCHEMA rls_test TO anon;
68- GRANT ALL ON rls_test .user_profiles TO anon;
69-
70- -- dev (TODO: issue theres a chance we might want all anon to be not granted, but were protecting records)
71- GRANT ALL ON rls_test .products TO anon;
45+ GRANT ALL ON rls_test .pets TO anon;
7246
7347-- Grant permissions to authenticated users
7448GRANT USAGE ON SCHEMA rls_test TO authenticated;
75- GRANT ALL ON rls_test .user_profiles TO authenticated;
76- GRANT ALL ON rls_test .products TO authenticated;
49+ GRANT ALL ON rls_test .pets TO authenticated;
7750
7851-- Grant permissions to service role (for admin operations)
7952GRANT USAGE ON SCHEMA rls_test TO service_role;
80- GRANT ALL ON rls_test .user_profiles TO service_role;
81- GRANT ALL ON rls_test .products TO service_role;
53+ GRANT ALL ON rls_test .pets TO service_role;
8254
8355-- Create indexes for better performance
84- CREATE INDEX IF NOT EXISTS idx_products_owner_id ON rls_test .products (owner_id);
85- CREATE INDEX IF NOT EXISTS idx_users_email ON rls_test .user_profiles (email);
56+ CREATE INDEX IF NOT EXISTS idx_users_user_id ON rls_test .pets (user_id);
8657
8758-- Create updated_at trigger function
8859CREATE OR REPLACE FUNCTION rls_test .update_updated_at_column()
@@ -95,11 +66,6 @@ $$ LANGUAGE plpgsql;
9566
9667-- Create triggers for updated_at
9768CREATE TRIGGER update_users_updated_at
98- BEFORE UPDATE ON rls_test .user_profiles
99- FOR EACH ROW
100- EXECUTE FUNCTION rls_test .update_updated_at_column ();
101-
102- CREATE TRIGGER update_products_updated_at
103- BEFORE UPDATE ON rls_test .products
69+ BEFORE UPDATE ON rls_test .pets
10470 FOR EACH ROW
105- EXECUTE FUNCTION rls_test .update_updated_at_column ();
71+ EXECUTE FUNCTION rls_test .update_updated_at_column ();
0 commit comments