我正在尝试确定是否可以为Postgres编写规则以在运行时动态更改查询。
基本上,我有一个多租户解决方案,它使用映射表来确定某个行是否由租户拥有。为了便于阅读,我简化了以下示例。
在这些示例中,“car”表由carmapping
表限定为特定租户,该表具有指向scoped_model_id
表和car
指向的外键scoping_model_pk
在租户/客户/任何通常被视为“范围模型”的模型,用于范围应用程序中的各种表格。
示例范围查询:
SELECT "car"."id" FROM "car" WHERE
("car"."id" IN (SELECT U0."scoped_model_id" FROM "carmapping" U0 WHERE U0."scoping_model_pk" IN (1));
原始查询:
SELECT "car"."id" FROM "car";
有没有办法使用规则动态添加这些WHERE子句?
它需要能够确定当前请求中scoping_model_pk
处于活动状态 - 是否将其作为所有数据库游标连接的附加元数据传递给Postgres,或者以某种方式作为noop字符串嵌入到SQL语句本身中。并且还需要确定SELECT语句当前所针对的模型的映射表 - 在本例中为carmapping
。
我们可以在ORM中的应用程序级别轻松地执行此操作,但最好在数据库级别进行一致性(因为我们有一些代码不使用ORM而不想记住更新任何原始SQL代码)。