<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=RLS_example</id>
	<title>RLS example - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=RLS_example"/>
	<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=RLS_example&amp;action=history"/>
	<updated>2026-04-24T15:40:35Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=RLS_example&amp;diff=5278&amp;oldid=prev</id>
		<title>Busk: Created page with &quot;# Simple Example ``` CREATE USER alice PASSWORD 'password'; CREATE USER bob PASSWORD 'password'; CREATE USER carol PASSWORD 'password'; GRANT group_admin TO alice; GRANT group...&quot;</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=RLS_example&amp;diff=5278&amp;oldid=prev"/>
		<updated>2024-05-27T13:47:51Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;# Simple Example ``` CREATE USER alice PASSWORD &amp;#039;password&amp;#039;; CREATE USER bob PASSWORD &amp;#039;password&amp;#039;; CREATE USER carol PASSWORD &amp;#039;password&amp;#039;; GRANT group_admin TO alice; GRANT group...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;# Simple Example&lt;br /&gt;
```&lt;br /&gt;
CREATE USER alice PASSWORD 'password'; CREATE USER bob PASSWORD 'password'; CREATE USER carol PASSWORD 'password'; GRANT group_admin TO alice; GRANT group_user TO bob; GRANT group_manager TO carol;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
CREATE TABLE confidential_data ( id SERIAL PRIMARY KEY, data TEXT, user_groups TEXT[] ); INSERT INTO confidential_data (data, user_groups) VALUES ('Admin and Manager Data', ARRAY['group_admin', 'group_manager']), ('User Data', ARRAY['group_user']), ('Admin and User Data', ARRAY['group_admin', 'group_user']);&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
ALTER TABLE confidential_data ENABLE ROW LEVEL SECURITY;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
CREATE POLICY group_policy ON confidential_data FOR SELECT USING (EXISTS ( SELECT 1 FROM unnest(user_groups) AS g WHERE g = ANY (SELECT rolname FROM pg_roles WHERE pg_has_role(current_user, oid, 'member')) ));&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
ALTER TABLE confidential_data FORCE ROW LEVEL SECURITY;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
# Detailed Example&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
CREATE ROLE group_admin; CREATE ROLE group_user; CREATE ROLE group_manager; CREATE USER alice PASSWORD 'password'; CREATE USER bob PASSWORD 'password'; CREATE USER carol PASSWORD 'password'; GRANT group_admin TO alice; GRANT group_user TO bob; GRANT group_manager TO carol;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
CREATE TABLE confidential_data ( id SERIAL PRIMARY KEY, data TEXT, user_groups TEXT[] ); INSERT INTO confidential_data (data, user_groups) VALUES ('Admin and Manager Data', ARRAY['group_admin', 'group_manager']), ('User Data', ARRAY['group_user']), ('Admin and User Data', ARRAY['group_admin', 'group_user']);&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
ALTER TABLE confidential_data ENABLE ROW LEVEL SECURITY; CREATE POLICY group_policy ON confidential_data FOR SELECT USING (EXISTS ( SELECT 1 FROM unnest(user_groups) AS g WHERE g = ANY (SELECT rolname FROM pg_roles WHERE pg_has_role(current_user, oid, 'member')) )); ALTER TABLE confidential_data FORCE ROW LEVEL SECURITY;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
SET ROLE alice; SELECT * FROM confidential_data;&lt;br /&gt;
 Alice should see rows where user_groups contains group_admin.&lt;br /&gt;
As Bob (group_user):&lt;br /&gt;
&lt;br /&gt;
SET ROLE bob; SELECT * FROM confidential_data;&lt;br /&gt;
 Bob should see rows where user_groups contains group_user.&lt;br /&gt;
As Carol (group_manager):&lt;br /&gt;
&lt;br /&gt;
SET ROLE carol; SELECT * FROM confidential_data;&lt;br /&gt;
 Carol should see rows where user_groups contains group_manager.&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
</feed>