Of course, using get_context and set_context is a great way to implement true 
multi-tenancy at DB level in Firebird. Multi-tenancy can be dangerous if 
implemented in middleware or SQLs because programmers make mistakes and can 
forget a where clause. What we want to do is to have the DB abstract that for 
us.

 

Create the following table:

 

CREATE TABLE MY_TABLE (

    ID            BIGINT NOT NULL,

    TENANT_ID     BIGINT NOT NULL,

    OTHER_COLUMN  VARCHAR(64)

);

 

And trigger

 

/* Trigger: MY_TABLE_BI0 */

CREATE OR ALTER TRIGGER MY_TABLE_BI0 FOR MY_TABLE

ACTIVE BEFORE INSERT POSITION 0

AS

begin

  NEW.TENANT_ID = (select rdb$get_context('USER_SESSION','TENANT_ID') from 
rdb$database);

end

^

SET TERM ; ^

 

We see that the trigger populates the TENANT_ID for us from a context variable 
that is valid for the whole session.

 

Now what we want is to have our view only return rows belonging to the 
logged-in tenant. I.e.:

 

create view VW_MY_TABLE as

select *

from MY_TABLE

where TENANT_ID = (select rdb$get_context('USER_SESSION','TENANT_ID') from 
rdb$database);

 

So all you need to do at the beginning of the session is to set the context:

select RDB$SET_CONTEXT('USER_SESSION','TENANT_ID',1) from rdb$database

 

and insert data

 

insert into MY_TABLE

(ID,OTHER_COLUMN)

values

(1,'Dome value')

 

Select * from VW_MY_TABLE will return our row

 

Change to a different tenant

select RDB$SET_CONTEXT('USER_SESSION','TENANT_ID',2) from rdb$database

 

Select * from VW_MY_TABLE will now return empty

 

Pretty cool… You just jave to watch your indexing

 

 

 

 

  • ... Vishal Tiwari vishuals...@yahoo.co.in [firebird-support]
    • ... 'Louis van Alphen' lo...@nucleo.co.za [firebird-support]
      • ... 'Martijn Tonies (Upscene Productions)' m.ton...@upscene.com [firebird-support]
        • ... 'Louis van Alphen' lo...@nucleo.co.za [firebird-support]
      • ... Vishal Tiwari vishuals...@yahoo.co.in [firebird-support]
        • ... Vishal Tiwari vishuals...@yahoo.co.in [firebird-support]
          • ... Vishal Tiwari vishuals...@yahoo.co.in [firebird-support]
            • ... Ann Harrison aharri...@ibphoenix.com [firebird-support]
              • ... Svein Erling Tysvær svein.erling.tysv...@kreftregisteret.no [firebird-support]
              • ... 'Louis van Alphen' lo...@nucleo.co.za [firebird-support]
                • ... 'Louis van Alphen' lo...@nucleo.co.za [firebird-support]
                • ... Vishal Tiwari vishuals...@yahoo.co.in [firebird-support]
                • ... Svein Erling Tysvær svein.erling.tysv...@kreftregisteret.no [firebird-support]
              • ... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]
    • ... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]

Reply via email to