DatabaseProgramming: functions.sql

File functions.sql, 9.2 KB (added by 235013, 12 days ago)
Line 
1-- =============================================================================
2-- FUNCTION 1: Full Name Resolution
3-- =============================================================================
4-- NULL when the user does not exist.
5CREATE OR REPLACE FUNCTION fn_get_full_name(p_user_id int4)
6RETURNS text LANGUAGE sql STABLE STRICT AS $$
7 SELECT first_name || ' ' || last_name
8 FROM "User"
9 WHERE user_id = p_user_id;
10$$;
11
12-- =============================================================================
13-- FUNCTION 2: Vendor ID Resolution via Project Contract
14-- =============================================================================
15-- The vendor is the vendor party on the project's contract; NULL when the
16-- project does not exist.
17CREATE OR REPLACE FUNCTION fn_get_vendor_id_for_project(p_project_id int4)
18RETURNS int4 LANGUAGE sql STABLE STRICT AS $$
19 SELECT cvc.vendor_id
20 FROM Project p
21 JOIN Client_Vendor_Contract cvc ON cvc.contract_id = p.contract_id
22 WHERE p.project_id = p_project_id;
23$$;
24
25-- =============================================================================
26-- FUNCTION 3: Client ID Resolution via Project Contract
27-- =============================================================================
28-- The client is the client party on the project's contract; NULL when the
29-- project does not exist.
30CREATE OR REPLACE FUNCTION fn_get_client_id_for_project(p_project_id int4)
31RETURNS int4 LANGUAGE sql STABLE STRICT AS $$
32 SELECT cvc.client_id
33 FROM Project p
34 JOIN Client_Vendor_Contract cvc ON cvc.contract_id = p.contract_id
35 WHERE p.project_id = p_project_id;
36$$;
37
38-- =============================================================================
39-- FUNCTION 4: Vendor User Ownership Check
40-- =============================================================================
41-- true when the user belongs to the vendor on the project's contract, false
42-- when it belongs to another vendor, NULL when the user is not a vendor user,
43-- the project does not exist or an argument is NULL.
44CREATE OR REPLACE FUNCTION fn_is_vendor_user_of_project(p_user_id int4, p_project_id int4)
45RETURNS bool LANGUAGE sql STABLE STRICT AS $$
46 SELECT vu.vendor_id = fn_get_vendor_id_for_project(p_project_id)
47 FROM Vendor_User vu
48 WHERE vu.user_id = p_user_id;
49$$;
50
51-- =============================================================================
52-- FUNCTION 5: Client User Ownership Check
53-- =============================================================================
54-- true when the user belongs to the client on the project's contract, false
55-- when it belongs to another client, NULL when the user is not a client user,
56-- the project does not exist or an argument is NULL.
57CREATE OR REPLACE FUNCTION fn_is_client_user_of_project(p_user_id int4, p_project_id int4)
58RETURNS bool LANGUAGE sql STABLE STRICT AS $$
59 SELECT cu.client_id = fn_get_client_id_for_project(p_project_id)
60 FROM Client_User cu
61 WHERE cu.user_id = p_user_id;
62$$;
63
64-- =============================================================================
65-- FUNCTION 6: Non-blank Text Guard
66-- =============================================================================
67-- Rejects NULL, empty text and text made of spaces only; p_name labels the error.
68CREATE OR REPLACE FUNCTION fn_assert_not_blank(p_value text, p_name text)
69RETURNS void LANGUAGE plpgsql AS $$
70BEGIN
71 IF btrim(coalesce(p_value, '')) = '' THEN
72 RAISE EXCEPTION '% must not be blank', p_name;
73 END IF;
74END;
75$$;
76
77-- =============================================================================
78-- FUNCTION 7: Positive Amount Guard
79-- =============================================================================
80-- Rejects NULL, zero and negative amounts; p_name labels the error.
81CREATE OR REPLACE FUNCTION fn_assert_positive(p_value numeric, p_name text)
82RETURNS void LANGUAGE plpgsql AS $$
83BEGIN
84 IF p_value IS NULL OR p_value <= 0 THEN
85 RAISE EXCEPTION '% must be greater than zero (received: %)', p_name, p_value;
86 END IF;
87END;
88$$;
89
90-- =============================================================================
91-- FUNCTION 8: Project Existence Guard
92-- =============================================================================
93CREATE OR REPLACE FUNCTION fn_assert_project_exists(p_project_id int4)
94RETURNS void LANGUAGE plpgsql AS $$
95BEGIN
96 IF NOT EXISTS (SELECT 1 FROM Project WHERE project_id = p_project_id) THEN
97 RAISE EXCEPTION 'Project % does not exist', p_project_id;
98 END IF;
99END;
100$$;
101
102-- =============================================================================
103-- FUNCTION 9: Vendor Existence Guard
104-- =============================================================================
105CREATE OR REPLACE FUNCTION fn_assert_vendor_exists(p_vendor_id int4)
106RETURNS void LANGUAGE plpgsql AS $$
107BEGIN
108 IF NOT EXISTS (SELECT 1 FROM Vendor WHERE vendor_id = p_vendor_id) THEN
109 RAISE EXCEPTION 'Vendor % does not exist', p_vendor_id;
110 END IF;
111END;
112$$;
113
114-- =============================================================================
115-- FUNCTION 10: Review Existence Guard
116-- =============================================================================
117CREATE OR REPLACE FUNCTION fn_assert_review_exists(p_review_id int4)
118RETURNS void LANGUAGE plpgsql AS $$
119BEGIN
120 IF NOT EXISTS (SELECT 1 FROM Review WHERE review_id = p_review_id) THEN
121 RAISE EXCEPTION 'Review % does not exist', p_review_id;
122 END IF;
123END;
124$$;
125
126-- =============================================================================
127-- FUNCTION 11: Client Existence Guard
128-- =============================================================================
129CREATE OR REPLACE FUNCTION fn_assert_client_exists(p_client_id int4)
130RETURNS void LANGUAGE plpgsql AS $$
131BEGIN
132 IF NOT EXISTS (SELECT 1 FROM Client WHERE client_id = p_client_id) THEN
133 RAISE EXCEPTION 'Client % does not exist', p_client_id;
134 END IF;
135END;
136$$;
137
138-- =============================================================================
139-- FUNCTION 12: Project Status Existence Guard
140-- =============================================================================
141CREATE OR REPLACE FUNCTION fn_assert_status_exists(p_status_id int4)
142RETURNS void LANGUAGE plpgsql AS $$
143BEGIN
144 IF NOT EXISTS (SELECT 1 FROM Project_Status WHERE status_id = p_status_id) THEN
145 RAISE EXCEPTION 'Project status % does not exist', p_status_id;
146 END IF;
147END;
148$$;
149
150-- =============================================================================
151-- FUNCTION 13: Subscription Tier Existence Guard
152-- =============================================================================
153CREATE OR REPLACE FUNCTION fn_assert_tier_exists(p_tier_id int4)
154RETURNS void LANGUAGE plpgsql AS $$
155BEGIN
156 IF NOT EXISTS (SELECT 1 FROM Subscription_Tier WHERE tier_id = p_tier_id) THEN
157 RAISE EXCEPTION 'Subscription tier % does not exist', p_tier_id;
158 END IF;
159END;
160$$;
161
162-- =============================================================================
163-- FUNCTION 14: Role Existence Guard
164-- =============================================================================
165CREATE OR REPLACE FUNCTION fn_assert_role_exists(p_role_id int4)
166RETURNS void LANGUAGE plpgsql AS $$
167BEGIN
168 IF NOT EXISTS (SELECT 1 FROM Role WHERE role_id = p_role_id) THEN
169 RAISE EXCEPTION 'Role % does not exist', p_role_id;
170 END IF;
171END;
172$$;
173
174-- =============================================================================
175-- FUNCTION 15: Client User Existence Guard
176-- =============================================================================
177CREATE OR REPLACE FUNCTION fn_assert_client_user_exists(p_user_id int4)
178RETURNS void LANGUAGE plpgsql AS $$
179BEGIN
180 IF NOT EXISTS (SELECT 1 FROM Client_User WHERE user_id = p_user_id) THEN
181 RAISE EXCEPTION 'Client user % does not exist', p_user_id;
182 END IF;
183END;
184$$;
185
186-- =============================================================================
187-- FUNCTION 16: Vendor User Existence Guard
188-- =============================================================================
189CREATE OR REPLACE FUNCTION fn_assert_vendor_user_exists(p_user_id int4)
190RETURNS void LANGUAGE plpgsql AS $$
191BEGIN
192 IF NOT EXISTS (SELECT 1 FROM Vendor_User WHERE user_id = p_user_id) THEN
193 RAISE EXCEPTION 'Vendor user % does not exist', p_user_id;
194 END IF;
195END;
196$$;
197
198-- =============================================================================
199-- FUNCTION 17: Management User Existence Guard
200-- =============================================================================
201CREATE OR REPLACE FUNCTION fn_assert_management_user_exists(p_user_id int4)
202RETURNS void LANGUAGE plpgsql AS $$
203BEGIN
204 IF NOT EXISTS (SELECT 1 FROM Management_User WHERE user_id = p_user_id) THEN
205 RAISE EXCEPTION 'Management user % does not exist', p_user_id;
206 END IF;
207END;
208$$;
209
210-- =============================================================================
211-- FUNCTION 18: Rating Dimension Existence Guard
212-- =============================================================================
213CREATE OR REPLACE FUNCTION fn_assert_dimension_exists(p_dimension_id int4)
214RETURNS void LANGUAGE plpgsql AS $$
215BEGIN
216 IF NOT EXISTS (SELECT 1 FROM Rating_Dimension WHERE dimension_id = p_dimension_id) THEN
217 RAISE EXCEPTION 'Rating dimension % does not exist', p_dimension_id;
218 END IF;
219END;
220$$;