Me pregunto si lo siguiente es posible en PostgreSQL usando RLS (o cualquier otro mecanismo). Quiero que un usuario pueda obtener ciertas filas de una tabla si su identificación coincide con una columna en otra tabla.
Por ejemplo, tenemos las siguientes tablas:
tabla "usuario": columnas: id, nombre
| id | name | | --- | --- | | 1 | one | | 2 | two | | 3 | three| | 4 | four |tabla "inquilino": columnas: id, nombre
| id | name | | --- | --- | | 1 | t1 | | 2 | t2 |tabla "usuario_inquilino": columnas: id_usuario, id_inquilino
| user_id | tenant_id| | --- | --- | | 1 | t1 | | 2 | t2 | | 3 | t1 | | 4 | t2 |Ahora solo quiero usuarios que tengan el mismo tent_id.
producción:
| id | name | | --- | --- | | 1 | one | | 3 | three|Para lograr esto, necesito crear una política como esta:
CREATE POLICY tenant_policy ON "user" USING (tenant_id = current_setting('my_user.current_tenant')::uuid);pero con la política anterior no funciona porque obtengo todos los usuarios.
Nota: la tabla de usuarios y arrendatarios tiene una relación de muchos a muchos.
PD Sé que podemos hacer esto mediante la unión o alguna otra condición. Pero quiero lograr el resultado anterior usando PostgreSQL usando RLS (seguridad de nivel de fila)
¡¡Gracias por adelantado!!
Si la seguridad de nivel de fila no funciona, es posible que se deba a una de las siguientes situaciones:
no habilitó la seguridad de nivel de fila:
ALTER TABLE "user" ENABLE ROW LEVEL SECURITY;el usuario es dueño de la tabla
Puede habilitar la seguridad de nivel de fila para el propietario con
ALTER TABLE "user" FORCE ROW LEVEL SECURITY;usted es un superusuario, que siempre está exento de RLS
eres un usuario define con BYPASSRLS
el parámetro row_security está off
Aparte de eso, probablemente tendrá que unirse a user_tenant en su política:
CREATE POLICY tenant_policy ON "user" USING ( EXISTS(SELECT 1 FROM user_tenant AS ut WHERE ut.user_id = "user".id AND ut.tenant_id = current_setting('my_user.current_tenant')::uuid ) );