! В InterBase 6.5 и выше введена новая система безопасности системных таблиц. См. документацию и скрипты в каталоге examples\security. Все нижеизложенное при выполнении на InterBase 6.5 или 7.x может привести к непредсказуемым результатам.
При создании БД InterBase системная таблица "RDB$USER_PRIVILEGES" не
содержит записей, следовательно для не-SYSDBA пользователей нет никаких
ограничений на доступ к системным таблицам.
Это означает, что любой пользователь может не только создавать и модифицировать
объекты базы данных, но и "в прямую" модифицировать системные таблицы вплоть
до удаления записей. Это справедливо и для "ISC4.GDB" ! (При создании обычных
таблиц RDB$USER_PRIVILEGES заполняется, и изначально правами обладает создатель
таблицы.)
Однако ситуацию легко исправить, выполнив следующую последовательность DSQL команд:
"GRANT ALL ON RDB$CHARACTER_SETS TO SYSDBA"
/* ...
... и т.д. для всех системных таблиц. После этого все пользователи
кроме SYSDBA теряют какой-либо доступ к системным таблицам и, как следствие
возможность работы с базой данных ...
далее: */
"GRANT SELECT ON RDB$CHARACTER_SETS TO PUBLIC"
/* ...
... и т.д. для всех системных таблиц */
Теперь пользователи могут работать с обычными (несистемными) таблицами и другими объектами базы данных, но не могут изменять структуру базы данных т.к. мета-данные доступны только "на чтение". Для большинства приложений этого уже достаточно. Если возникнет необходимость, можно настроить доступ более "тонко" и избирательно позволить модифицировать те или иные мета-данные.
В случае с базой данных "ISC4.GDB" можно не давать пользователям доступа
к системным таблицам, а допустить их лишь к таблицам "HOST_INFO" и "USERS".
При этом пользователи будут иметь возможность подключаться к серверу,
работать с обычными базами данных, но не смогут даже просматривать мета-данные
"ISC4.GDB".
примечание: в InterBase 4.5 будет введен синтаксис GRANT ROLE, поэтому необходимость в подобных действиях отпадет.
CONNECT "MYSERVER:C:/MYDIR/TEST.GDB" USER "SYSDBA" PASSWORD "masterkey";
GRANT ALL ON RDB$CHARACTER_SETS TO SYSDBA;
GRANT ALL ON RDB$CHECK_CONSTRAINTS TO SYSDBA;
GRANT ALL ON RDB$COLLATIONS TO SYSDBA;
GRANT ALL ON RDB$DATABASE TO SYSDBA;
GRANT ALL ON RDB$DEPENDENCIES TO SYSDBA;
GRANT ALL ON RDB$EXCEPTIONS TO SYSDBA;
GRANT ALL ON RDB$FIELD_DIMENSIONS TO SYSDBA;
GRANT ALL ON RDB$FIELDS TO SYSDBA;
GRANT ALL ON RDB$FILES TO SYSDBA;
GRANT ALL ON RDB$FILTERS TO SYSDBA;
GRANT ALL ON RDB$FORMATS TO SYSDBA;
GRANT ALL ON RDB$FUNCTION_ARGUMENTS TO SYSDBA;
GRANT ALL ON RDB$FUNCTIONS TO SYSDBA;
GRANT ALL ON RDB$GENERATORS TO SYSDBA;
GRANT ALL ON RDB$INDEX_SEGMENTS TO SYSDBA;
GRANT ALL ON RDB$INDICES TO SYSDBA;
GRANT ALL ON RDB$LOG_FILES TO SYSDBA;
GRANT ALL ON RDB$PAGES TO SYSDBA;
GRANT ALL ON RDB$PROCEDURE_PARAMETERS TO SYSDBA;
GRANT ALL ON RDB$PROCEDURES TO SYSDBA;
GRANT ALL ON RDB$REF_CONSTRAINTS TO SYSDBA;
GRANT ALL ON RDB$RELATION_CONSTRAINTS TO SYSDBA;
GRANT ALL ON RDB$RELATION_FIELDS TO SYSDBA;
GRANT ALL ON RDB$RELATIONS TO SYSDBA;
GRANT ALL ON RDB$SECURITY_CLASSES TO SYSDBA;
GRANT ALL ON RDB$TRANSACTIONS TO SYSDBA;
GRANT ALL ON RDB$TRIGGER_MESSAGES TO SYSDBA;
GRANT ALL ON RDB$TRIGGERS TO SYSDBA;
GRANT ALL ON RDB$TYPES TO SYSDBA;
GRANT ALL ON RDB$USER_PRIVILEGES TO SYSDBA;
GRANT ALL ON RDB$VIEW_RELATIONS TO SYSDBA;
/* эти четыре строки нужно выполнять только для ISC4.GDB */
/* GRANT ALL ON USERS TO SYSDBA; */
/* GRANT ALL ON HOST_INFO TO SYSDBA; */
/* GRANT SELECT ON USERS TO PUBLIC; */
/* GRANT SELECT ON HOST_INFO TO PUBLIC; */
/* эту часть скрипта нужно выполнять для обычных БД, и необязательно - для ISC4.GDB*/
GRANT SELECT ON RDB$CHARACTER_SETS TO PUBLIC;
GRANT SELECT ON RDB$CHECK_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON RDB$COLLATIONS TO PUBLIC;
GRANT SELECT ON RDB$DATABASE TO PUBLIC;
GRANT SELECT ON RDB$DEPENDENCIES TO PUBLIC;
GRANT SELECT ON RDB$EXCEPTIONS TO PUBLIC;
GRANT SELECT ON RDB$FIELD_DIMENSIONS TO PUBLIC;
GRANT SELECT ON RDB$FIELDS TO PUBLIC;
GRANT SELECT ON RDB$FILES TO PUBLIC;
GRANT SELECT ON RDB$FILTERS TO PUBLIC;
GRANT SELECT ON RDB$FORMATS TO PUBLIC;
GRANT SELECT ON RDB$FUNCTION_ARGUMENTS TO PUBLIC;
GRANT SELECT ON RDB$FUNCTIONS TO PUBLIC;
GRANT SELECT ON RDB$GENERATORS TO PUBLIC;
GRANT SELECT ON RDB$INDEX_SEGMENTS TO PUBLIC;
GRANT SELECT ON RDB$INDICES TO PUBLIC;
GRANT SELECT ON RDB$LOG_FILES TO PUBLIC;
GRANT SELECT ON RDB$PAGES TO PUBLIC;
GRANT SELECT ON RDB$PROCEDURE_PARAMETERS TO PUBLIC;
GRANT SELECT ON RDB$PROCEDURES TO PUBLIC;
GRANT SELECT ON RDB$REF_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON RDB$RELATION_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON RDB$RELATION_FIELDS TO PUBLIC;
GRANT SELECT ON RDB$RELATIONS TO PUBLIC;
GRANT SELECT ON RDB$SECURITY_CLASSES TO PUBLIC;
GRANT SELECT ON RDB$TRANSACTIONS TO PUBLIC;
GRANT SELECT ON RDB$TRIGGER_MESSAGES TO PUBLIC;
GRANT SELECT ON RDB$TRIGGERS TO PUBLIC;
GRANT SELECT ON RDB$TYPES TO PUBLIC;
GRANT SELECT ON RDB$USER_PRIVILEGES TO PUBLIC;
GRANT SELECT ON RDB$VIEW_RELATIONS TO PUBLIC;