STRING = STUB || ROLENAME || ' TO ' || USR;
IF (GRANTOPT = 1) THEN
STRING = STRING || ' WITH ADMIN OPTION ;';
ELSE
STRING = STUB || ROLENAME || ' FROM ' || DSR || PERM = STRING;
SUSPEND;
PERM = COMMENTS;
SUSPEND;
END
/* Если передано ANY в качестве привилегии, создаем отдельно каждую привилегию */
IF (PRIV = 'ANY') THEN
STUB = STUB || 'SELECT, DELETE, INSERT, UPDATE, REFERENCES ON ';
ELSE
STUB = STUB || PRIV || ' ON ' ;
/* Просмотр всех имен таблиц и просмотров и создание для каждого оператора */
FOR SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME NOT STARTING WITH 'RDB$'
INTO : RELNAME DO
BEGIN
STRING = STUB || :RELNAME || ' '
IF (CMD STARTING WITH 'G') THEN
STRING = STRING || 'TO ';
ELSE
STRING = STRING || 'FROM ';
STRING = STRING || VUSR;
IF (CMD STARTING WITH 'G'
AND GRANTOPT = 1 AND ROLENAME IS NULL) THEN
STRING = STRING || ' WITH GRANT OPTION ;';
ELSE
STRING = STRING || ' ;';
PERM = STRING;
SUSPEND;
END
PERM = COMMENTS;
SUSPEND;
END ^
SET TERM ;^
Перейдите в каталог Firebird /bin и запустите isql, соединитесь с базой данных как пользователь SYSDBA. Вы используете процедуру для создания скрипта, который добавит роль 'MANDRAKE', предоставит эту роль пользователю USER1, а потом установит полномочия для этой роли. Затем снова сделает то же самое с существующей ролью 'PURPLE' для пользователя USER2:
SQL> OUTPUT L:\DATA\EXAMPLES\PERMSCRIPT.SQL;
SQL> SELECT * FROM PERMSCRIPT ('G', 'ALL', 'USER1', 'MANDRAKE', 1, 1);
SQL> COMMIT;
SQL> SELECT * FROM PERMSCRIPT ('G', 'ALL', 'USER2', 'PURPLE', 1, 0);
SQL> COMMIT; SQL> OUTPUT;
SQL> INPUT L:\DATA\EXAMPLES\PERMSCRIPT.SQL;
SQL> COMMIT; SQL> SHOW GRANT;
Вот и все. Вы получите сообщение об ошибке, когда утилита INPUT встретит текст не SQL, напечатанный в OUTPUT, однако это не повлияет на вывод полномочий.
Инсталляция полномочий непосредственно из процедуры
Процедура GRANT_PERMS, показанная в листинге 35.2, в основном похожа на процедуру PERMSCRIPT из листинга 35.1. Вместо того чтобы создавать набор выходных строк для выполнения под isql в качестве скрипта, она непосредственно устанавливает полномочия через EXECUTE STATEMENT. Такая техника недоступна в Firebird 1,0.x.
Листинг 35.2. Процедура полномочий
/* (с) Helen Borrie 2004, free for use and modification under the Initial Developer's Public License */
SET TERM ^;
CREATE PROCEDURE GRANT_PERMS
(CMD VARCHAR(6) ,
PRIV CHAR(10),
USR VARCHAR (31) ,
ROLENAME VARCHAR(31),
GRANTOPT SMALLINT)
AS
DECLARE VARIABLE RELNAME VARCHAR (31);
DECLARE VARIABLE EXESTRING VARCHAR(1024) = '';
DECLARE VARIABLE EXESTUB VARCHAR (1024 ) = '';
BEGIN
IF (ROLENAME = ' ' ) THEN ROLENAME = NULL;
IF (USR = '') THEN USR = NULL;
IF (PRIV = '') THEN PRIV = NULL;
IF ((PRIV IS NULL AND ROLENAME IS NULL) OR USR IS NULL) THEN EXIT;
IF (CMD STARTING WITH 'G') THEN
EXESTUB = 'GRANT ';
ELSE
EXESTUB = 'REVOKE ';
IF (ROLENAME IS NOT NULL) THEN
BEGIN
IF (EXESTUB = 'GRANT') THEN
BEGIN
EXESTUB = EXESTUB || ROLENAME || ' TO ' || USR;
IF (GRANTOPT = 1) THEN
EXESTUB = EXESTUB || ' WITH ADMIN OPTION';
ELSE
EXESTUB = EXESTUB || ROLENAME || ' FROM ' || USR;
EXECUTE STATEMENT EXESTUB;
END
ELSE
BEGIN
IF (PRIV = 'ANY') THEN
EXESTUB = EXESTUB || 'SELECT,DELETE,INSERT,UPDATE,REFERENCES ON ';
ELSE
EXESTUB = EXESTUB || PRIV || ' ON ' ;
FOR SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME NOT STARTING WITH 'RDB$'
INTO : RELNAME DO
BEGIN
EXESTRING = EXESTUB || :RELNAME || ' ';
IF (CMD STARTING WITH 'G') THEN
EXESTRING = EXESTRING || 'TO ';
ELSE
EXESTRING = EXESTRING || 'FROM ';
EXESTRING = EXESTRING || USR;
IF (GRANTOPT = 1) THEN
EXESTRING = EXESTRING || ' WITH GRANT OPTION';
EXECUTE STATEMENT EXESTRING;
END
END
END ^
SET TERM ;^
Если вы сами хотите поэкспериментировать с этими скриптами и изменить их для ваших потребностей, вы можете найти исходные тексты в разделе Download на http://www.apress.com, в файле permscripts.sql.
Следующая (и последняя) глава этой части содержит множество тем, связанных с архитектурными вариантами сервера, включая раздел по инсталляции и использованию встроенного Суперсервера под Windows. Установки файла конфигурации в firebird.conf или isc config/ibconfig могут быть найдены в этой главе вместе с темой безопасности параметров конфигурации, связанных с использованием в Firebird внешних выполняемых и других файлов.
ГЛАВА 36. Конфигурация и специальные возможности.
Эта глава представляет собой попурри на темы, которые будут интересны тем разработчикам, кто хорошо знаком с практическими вопросами выполнения Firebird.
Сначала описываются архитектурные отличия между моделями Firebird Классический сервер и Суперсервер. Затем обсуждаются различные параметры конфигурации сервера и некоторые руководящие принципы разработки для встроенного сервера под Windows.