среда, 26 марта 2014 г.

Дано: IBM Informix, Четыре похожих, но разных базы, кучу пользователей (частично совпадающих, частично нет), кучу прав этих пользователей на различные куски этих баз. Server Studio и в ряде случаев только dbaccess.
Задача 1: Каждый раз создавая в подсхеме базы таблицу, с внешними ключами и каскадным удалением необходимо проверить права на удаление из верхних таблиц и дать им права на удаление из новой таблицы. Чтобы каскад не рушился.
Задача 2: Когда возникает необходимость создать нового пользователя, ему иногда надо скопировать права другого пользователя.
Задача 3: Поддержание в актуальном состоянии отчетов и сводок о правах пользователей.
А также: Прочие задачи формирования или получения списка прав.

Решение:
1. Получить из системной таблицы systables идентификатор исходной таблицы SELECT tabid FROM systables WHERE tabname="table_name1".
2. Для этого идентициатора таблицы из таблицы systabauth выбрать права.
3. Добавить в запрос несколько формальных столбцов, как упоминалось ранее.
4. На выходе получить таблицу, содержание которой может быть скопировано в качестве запроса.

Итого в качестве примера .
Запрос на дублирование прав из таблицы table_name1 в таблицу table_name2.

SELECT 'GRANT', CASE tabauth
WHEN "s--------" THEN "SELECT"
WHEN "su-id----" THEN "SELECT, UPDATE, INSERT, DELETE"
WHEN "su-i-----" THEN "SELECT, UPDATE, INSERT"
WHEN "su-------" THEN "SELECT, UPDATE"
WHEN "s--i-----" THEN "SELECT, INSERT"
WHEN "----d----" THEN "DELETE"
WHEN "---id----" THEN "INSERT, DELETE"
ELSE tabauth END CASE, 'ON table_name2 TO' ,grantee, ';' FROM systabauth WHERE tabid IN (SELECT tabid FROM systables WHERE tabname="table_name1");

Запрос на получение права DELETE на таблицу table_name2, для всех у кого есть DELETE на таблицу table_name1.

SELECT 'GRANT DELETE ON table_name2 TO ',grantee, ';' FROM systabauth WHERE (tabauth="----d----" OR tabauth="su-id----" OR tabauth="---id----")
AND tabid IN (SELECT tabid FROM systables WHERE tabname="table_name1");

UPD
В запросе допущена ошибка (не мешающая, впрочем, выполнению запроса, но). Ошибка и ее истоки описаны позднее http://karhet.blogspot.ru/2014/06/blog-post.html. 

Комментариев нет:

Отправить комментарий