LINUX.ORG.RU

[postgrtesql]узнать свои права на уровне SQL


0

0

Ситуация следующая:
необходимо узнать есть ли у меня право читать, модифицировать, дополнять таблицу.

\dp не предлагать, т.к. запускатся команда должна из клиентского приложения (Qt4) (или подскажите как ее там запустить, как SQL запрос естественно не проходит).
Я приблизительно понимаю, что нужно копать где-то в таблицах pg_catalog. , но где точно не могу найти. Может быть кто-нибудь подскажет?

★★★★★

Ответ на: комментарий от bibi

Я пока что не нашел.
В Postgres SHOW можно только переменные самого постгреса.

trex6 ★★★★★
() автор топика

Запусти strace -s 1024 psql и дай ему \dp, увидишь, какой запрос он шлет на сервер. А еще можно в исходниках psql глянуть.

vga ★★
()
Ответ на: комментарий от vga

Вот такое например у меня получилось.

$strace -e network -s 1024 psql

поскипано

postgres=# \dp auth_user;

SELECT n.nspname as \«Schema\»,\n c.relname as \«Name\»,\n CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'S' THEN 'sequence' END as \«Type\»,\n c.relacl as \«Access privileges\»\nFROM pg_catalog.pg_class c\n LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE c.relkind IN ('r', 'v', 'S')\n AND c.relname ~ '^(auth_user)$'\n AND n.nspname !~ '^pg_' AND pg_catalog.pg_table_is_visible(c.oid)\nORDER BY 1, 2;

vga ★★
()
Ответ на: комментарий от vga

А в исходниках вот так

     printfPQExpBuffer(&buf,
                                          "SELECT n.nspname as \"%s\",\n"
                                          "  c.relname as \"%s\",\n"
                                          "  CASE c.relkind WHEN 'r' THEN '%s' WHEN 'v' THEN '%s' WHEN 'S' THEN '%s' END as \"%s\",\n"
                                          "  c.relacl as \"%s\"\n"
                                          "FROM pg_catalog.pg_class c\n"
           "     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
                                          "WHERE c.relkind IN ('r', 'v', 'S')\n",
                                          _("Schema"), _("Name"), _("table"), _("view"), _("sequence"), _("Type"), _("Access privileges"));

Взял здесь http://www.google.com/codesearch/p?hl=en#5KTrgOW2hXs/pub/nslu2/sources/postgr...|68GcYBEBE5A/postgresql-8.2.4/src/bin/psql/describe.c&q=psql%20lang:c%20file:psql.c&d=8

Только осторожно, может оно от версии к версии меняется, так что лучше проверь для своих поддерживаемых версий.

vga ★★
()
Ответ на: комментарий от vga

Для пришедших по поиску.

Я проверил в свой версии Postgresql (8.3)

В итоге запрос на получение данных выглядит так:
«select relacl from pg_catalog.pg_class where relname='tablename';»

Как разобратся с полученным в ответ нагромаждением символов можно почитать в руководстве, там где описывается команда \dp
(в моем руководстве это раздел описания SQL команд в примечаниях к команде GRANT)

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Вот и отлично, похоже тему можно закрывать.

vga ★★
()

> необходимо узнать есть ли у меня право читать, модифицировать, дополнять таблицу.

http://www.postgresql.org/docs/8.3/static/functions-info.html

читать

select has_table_privilege('table_name', 'SELECT');

модифицировать

select has_table_privilege('table_name', 'UPDATE');

дополнять

select has_table_privilege('table_name', 'INSERT');

Eshkin_kot ★★
()
Ответ на: комментарий от vga

Запусти strace -s 1024 psql и дай ему \dp, увидишь, какой запрос он шлет на сервер.

в psql есть встроенный способ просмотра системных запросов отправляемых psql:

  -E              показывать запросы, порожденные внутренними  командами

$ psql -E -c '\dp a'
********* QUERY **********
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'S' THEN 'sequence' END as "Type",
  c.relacl as "Access privileges"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'v', 'S')
  AND c.relname ~ '^(a)$'
  AND n.nspname !~ '^pg_' AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;
**************************
Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

Большое спасибо!
Не очень внимательно читал ман про функции и операторы. А там оказываетя такая вот замечательная вещь описанна! Большое спасибо.

trex6 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.