Re: Sanitize schema name

Поиск
Список
Период
Сортировка
От Ludovic Gasc
Тема Re: Sanitize schema name
Дата
Msg-id CAON-fpFdsLYd_m1b1LubtSg30Q74cJo5n0mwDeUz_JJ-dGT6_w@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Sanitize schema name  (Adrian Klaver <adrian.klaver@aklaver.com>)
Ответы Re: Sanitize schema name  (Adrian Klaver <adrian.klaver@aklaver.com>)
Список psycopg
2015-05-10 2:41 GMT+02:00 Adrian Klaver <adrian.klaver@aklaver.com>:
On 05/09/2015 01:03 PM, Ludovic Gasc wrote:
2015-05-08 0:12 GMT+02:00 Adrian Klaver <adrian.klaver@aklaver.com
<mailto:adrian.klaver@aklaver.com>>:


    On 05/07/2015 01:06 PM, Ludovic Gasc wrote:

        Thanks all for your answers, you understand well my need.

        About PQescapeIdentifier:
        1. An idea of release date for the next version of psycopg2 ?
        2. Are you sure it's enough to protect against SQL injections,
        because
        you can read in the documentation: *Tip:* As with string
        literals, to
        prevent SQL injection attacks, SQL identifiers must be escaped
        when they
        are received from an untrustworthy source.

        About format() it doesn't work for schema, example:
        SELECT format('SELECT * FROM %I WHERE id=1', 'lg.devices')
        => SELECT * FROM "lg.devices" WHERE id=1
        SELECT * FROM "lg.devices" WHERE id=1
        => ERROR:  relation "lg.devices" does not exist
        LIGNE 1 : SELECT * FROM "lg.devices" WHERE id=1
                                  ^

        ********** Error **********

        ERROR: relation "lg.devices" does not exist


    Try:

    SELECT format('SELECT * FROM %I.%I WHERE id=1', 'lg', 'devices')


Ok, now, it works, but, I need to launch the query two times: First time
with SELECT format(, a second time with the result of the first query.
It should be possible to execute that only in one pass ?

As far as I know, only in plpgsql:

http://www.postgresql.org/docs/9.4/static/plpgsql-statements.html#PLPGSQL-QUOTE-LITERAL-EXAMPLE

Hence the previous suggestion about creating a psycopg2 function that you could use directly.

Ok, at least to me, it's the ideal situation.
 





    Still not sure why you cannot use search_path and avoid the schema
    qualification altogether?


Because I use a pool of pgsql sockets where no connexions are dedicated
to one particular client.

So all the clients are connecting to a single database with many schemas, each schema unique to a client?

Exactly. With that, I can easily generate cross statistics between clients for billing, because I've a hierarchy of clients.
 


I could change that each time just before to execute each query, but it
shouldn't be very efficient.


So is the login role for each client unique, where you could use ALTER ROLE SET search_path to have it preset:

http://www.postgresql.org/docs/9.4/interactive/sql-alterrole.html

Thanks for your help, but this suggestion doesn't fit with my need: If I do that, I need to have a dedicated connection for each client.
The idea is to mutualize pgsql connections for all clients like an applicative "virtualization": for some big clients, it will use several connections from the aiopg's pool, for some others, it uses no connections.
 





    --
    Adrian Klaver
    adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>




--
Adrian Klaver
adrian.klaver@aklaver.com

В списке psycopg по дате отправления:

Предыдущее
От: Adrian Klaver
Дата:
Сообщение: Re: Sanitize schema name
Следующее
От: "P. Christeas"
Дата:
Сообщение: Re: Sanitize schema name