Tabellen vorfiltern ("Mandantenfähigkeit")

Hallo allerseits,

ich bin beim Entwickeln einer Anwendung, die eine Mandanten ähliche Lösung benötigt. D.h. es gibt einige (nicht alle) Tabellen, die eine gleiche Spalte besitzen:

z.B. ClinetId

Tabelle1 (ClientId, Id, name, data, ...)
Tabelle2 (ClientId, Id, Tabelle1_Id, data1, data2, data3 ...)

Nun möchte ich Daten aus mehreren Tabellen beziehen. Jedoch nur die Daten, wo ClientId leer ist oder enthält einen speziellen Wert.

Also so ähnlich:

-- Globale Filter setzen (Syntax ist ausgedacht)
SET_GLOBAL_FILTER F1 TO Tabelle1 WHERE (ClientId IS NULL) OR (ClientId = 'WertX');
SET_GLOBAL_FILTER F2 TO Tabelle2 WHERE (ClientId IS NULL) OR (ClientId = 'WertX');

-- Abfragen an die Datenbank
SELECT * FROM Tabelle1 WHERE name LIKE 'a%';
SELECT * FROM Tabelle2 WHERE data 2 LIKE 'a%';
SELECT T1.Id, T2.data1 FROM Tabelle1 T1, Tabelle2 T2 WHERE T1.Id = T2.Tabelle1_Id;

-- Globale Filter entfernen (Syntax ist ausgedacht)
DELETE_GLOBAL_FILTER F1;
DELETE_GLOBAL_FILTER F2;

Ich möchte also bei den eigentlichen Abfragen das Feld ClientId nicht immer manuell setzen, sondern global definieren. z.B. für eine Transaction oder dauerhaft.

Ist so etwas bei PostgreSQL möglich? Ich werde zwar noch weiter danach im Internet suchen, aber langsam glaube ich dass es bei PostreSQL nicht geht.

Du könntest mit VIEW’s arbeiten. Dein ‘global filter’ definiert die View, auf der arbeitest Du dann weiter.

Hallo akretschmer,

vielen Dank für die schnelle Antwort. Umgeschrieben würde es wohl so aussehen:

CREATE TEMP VIEW view1 AS SELECT * FROM Tabelle1 WHERE (ClientId IS NULL) OR (ClientId = 'WertX');
CREATE TEMP VIEW view2 AS SELECT * FROM Tabelle2 WHERE (ClientId IS NULL) OR (ClientId = 'WertX');

SELECT * FROM view1 WHERE name LIKE 'a%';
SELECT * FROM view2 WHERE data 2 LIKE 'a%';
SELECT T1.Id, T2.data1 FROM view1 T1, view2 T2 WHERE T1.Id = T2.Tabelle1_Id;

DROP VIEW view1;
DROP VIEW view2;

Genau. Wobei Du eher expliziete als impliziete Joins nutzen solltest. Ich bin mir jetzt nicht sicher, wie ‘smart’ der Planner in solch einer Konstellation ist, ob z.B. die Where-Bedingungen des Views dann beim Join beachtet werden oder erst später wirken - das solltest Du via Explain mal prüfen, mit Deinen realen Tabellen & Daten.