Open1
SQLメモ

postgres RLSが効いたマルチテナントの特定のテーブルに対してすべてのテナントのレコード数を一回のクエリで取得したい
CREATE OR REPLACE FUNCTION query_count_for_all_tenants(
target_table text -- 取得対象のテーブル名
)
RETURNS TABLE (
tenant_id text,
tenant_name text,
count INTEGER
) AS $$
DECLARE
tenant_record record;
result INTEGER;
BEGIN
-- テナントテーブルからすべてのテナントIDを取得
FOR tenant_record IN
SELECT id, name FROM tenants -- テナントテーブルの名前に合わせて調整
LOOP
-- カレントセッションのテナントIDを設定
PERFORM set_config(
'app.current_tenant_id',
tenant_record.id::text,
false
);
-- 単純なSELECTをそのまま実行して結果をJSONB配列として取得
EXECUTE format('SELECT COUNT(*) FROM %I t', target_table) INTO result;
-- 結果を返す
tenant_id := tenant_record.id;
tenant_name := tenant_record.name;
count := result;
RETURN NEXT;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT * FROM query_count_for_all_tenants('users');