четверг, 19 июня 2014 г.

Давно стоило об этом написать, но все как-то руки не доходили.
Чуть ниже я описывала способ как сократить ручную работу при наследовании прав пользователей на таблицы в Informix.
Пост необходимо отредактировать из-за нюанса, который я сейчас опишу.
В системных таблицах Informix есть таблицы пользователей (sysusers), таблица таблиц (systables) и таблица соответствия прав пользователей и таблиц (systabauth). Но есть нюанс. В таблице systabauth есть ссылка на systables. Но нету ссылки на sysusers. Пользователь записывается в строчном виде из нструкции "GRANT" и потом по строковому соответствию ищется при "REMOVE".
Отсюда мы сталкиваемся со всеми проблемами присущими строковому представлению. А именно:
USER_NAME <> "USER_NAME" <> " USER_NAME " <> " USER_NAME" <> "user_name"

В том виде, в котором я делала запрос:
SELECT 'GRANT DELETE ON table_name2 TO' ,grantee, ';' FROM systabauth WHERE ...
Я получала запрос вида: GRANT DELETE ON table_name2 TO USER_NAME FROM ...

Запрос выполняется корректно. Однако в таблицу systabauth записывался пользователь с именем в нижнем регистре (которого по сути не существует). А это, как мы уже знаем - совершенно другой пользователь. Как следствие - права вроде как есть. Но их на самом деле нет.

Недолго думая я вставила кавычки и получила запрос:
SELECT 'GRANT DELETE ON table_name2 TO "' ,grantee, '";' FROM systabauth WHERE ...
А после копирования результата в строку запроса
GRANT DELETE ON table_name2 TO " USER_NAME " FROM ...

На самом деле пробелы - это тоже некорректно, но с ними просто бороться путем автозамены, увы, пока другого способа я не нашла. Но после ликвидации пробелов все работает правильно.

Далее в выпуске - системные таблицы mysql.