Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access custom schema from supabase-js client?

I love Supabase but our team needs to use schema functionality that PostgreSQL offers - unfortunately we have been unsuccessfully to make schemas working so far.

Other info:

  • PostgreSQL 14
  • newest version of the Supabase JS SDK's
  • we have supabase hosted with Supabase's pro plan

What we have tried:

  1. We created a new schema and added access to all types of authentication (why all? We first thought that maybe there is an error with authentication):

    CREATE SCHEMA Brano;
    GRANT USAGE ON SCHEMA Brano TO postgres, anon, authenticated, service_role, dashboard_user;
    
  2. Exposed schema to the API via this setting:

    enter image description here

  3. Tried the following code:

    var options = {
        schema: 'brano'
    }
    
    const supabaseUrl = 'supabaseUrl'
    const supabaseKey = 'supabaseKey'
    const supabaseClient = createClient(supabaseUrl, supabaseKey, options);
    
    const { data, error } = await supabaseClient
        .from('test_brano')
        .insert([{
            data: 123
    }]);
    
  4. Got this error:

    {
        "message":"permission denied for table test_brano",
        "code":"42501",
        "details":null,
        "hint":null
    }
    

Links and documentation that we have tried reading (unfortunately we didn't make it work either way):

  • https://github.com/supabase/supabase/discussions/7642
  • https://github.com/supabase/postgrest-js/issues/280
  • https://supabase.com/docs/reference/javascript/initializing#with-additional-parameters
  • https://github.com/supabase/supabase/discussions/1222

Did we missed something? Thanks in advance!

like image 828
Jakub Szlaur Avatar asked Jan 01 '26 06:01

Jakub Szlaur


1 Answers

In addition to the first two steps you did:

  1. Granting usage:

    CREATE SCHEMA Brano;
    
    GRANT USAGE 
    ON SCHEMA Brano 
    TO postgres, anon, authenticated, service_role, dashboard_user;
    
    ALTER DEFAULT PRIVILEGES IN SCHEMA brano
    GRANT ALL ON TABLES TO postgres, anon, authenticated, service_role, dashboard_user;
    
  2. Exposing the schema in the Settings:

    enter image description here

There's a third step that was missing:

  1. Granting actions to be able to insert/select data:

    GRANT SELECT, INSERT, UPDATE, DELETE 
    ON ALL TABLES IN SCHEMA brano 
    TO postgres, authenticated, service_role, dashboard_user, anon;
    
    GRANT USAGE, SELECT 
    ON ALL SEQUENCES IN SCHEMA brano 
    TO postgres, authenticated, service_role, dashboard_user, anon;
    

⚠️ Warning ⚠️

You must set these grants again for every new table created in the custom schema.

Then you can call it as in your example:

Supabase JS v2:

    const options = {
      db: { schema: 'brano' }
    };
    const supabase = createClient(supabaseUrl, SUPABASE_KEY, options)
    const d = new Date(2018, 11, 24, 10, 33, 30, 0);
    const { data, error } = await supabase
      .from('test_brano')
      .insert([
        { data: 3, created_at: d }
      ])
    console.log(data)
    if (error) {
        console.log("error getting results");
        throw error;
    }

Supabase JS v1:

    const options = {
      schema: 'brano'
    }
    const supabase = createClient(supabaseUrl, SUPABASE_KEY, options)
    const d = new Date(2018, 11, 24, 10, 33, 30, 0);
    const { data, error } = await supabase
      .from('test_brano')
      .insert([
        { data: 3, created_at: d }
      ])
    console.log(data)
    if (error) {
        console.log("error getting results");
        throw error;
    }
like image 99
Mansueli Avatar answered Jan 03 '26 13:01

Mansueli



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!