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');