Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Создание скрипта
Создание скрипта
Автор предпочитает генерировать скрипт безопасности. Он может быть протестирован и аннотирован, он является документом, нужным для контроля качества, и дающим основу для распространения у пользователей. Пример подобного скрипта представлен в листинге 35.1.
Для скрипта мы можем использовать внешний файл, в который помещен скрипт - инструкции и примеры см. в главе 16, примеры также содержатся в главе 30. Однако процедура PERMSCRIPT, описанная здесь, разработана для выполнения в isql и для передачи ее выхода в текстовый файл.
Листинг 35.1. Процедура для генерации скрипта полномочий
/* (с) Helen Borrie 2004, free for use and inodxfication
under the Initial Developer's Public License */
SET TERM ^
CREATE PROCEDURE PERMSCRIPT(
CMD VARCHAR (6) ,/* введите 'G' or 'R' */
PRIV CHAR (10) , /* привилегия или 'ALL' или 'ANY' */
USR VARCHAR(31), /* имя пользователя */
ROLENAME VARCHAR(31), /* роль, существующая или нет */
GRANTOPT SMALLINT,
/* 1 для 'WITH GRANT[ADMIN] OPTION' */
CREATE ROLE SMALLINT) /* 1 для создания новой роли ROLENAME */
RETURNS (PERM VARCHAR(80)) /* теоретический оператор полномочия */
AS
DECLARE VARIABLE RELNAME VARCHAR (31); /* для имени таблицы или просмотра */
DECLARE VARIABLE STRING VARCHAR(80) = ''; /* используется в процедуре */
DECLARE VARIABLE STUB VARCHAR(60) = ''; /* используется в процедуре */
DECLARE VARIABLE VUSR VARCHAR(31) ; /* имя пользователя для 'TO' или 'FROM' */
DECLARE VARIABLE COMMENTS CHAR(20) = '/* */';
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 (ROLENAME IS NOT NULL) THEN
BEGIN
/* Если задано имя роли, то создается роль, если она требуется */
IF (CREATE_ROLE = 1) THEN BEGIN
PERM = 'CREATE ROLE ' || ROLENAME || ' ; ' ;
SUSPEND;
PERM = 'COMMIT; ' ;
SUSPEND;
PERM = COMMENTS;
SUSPEND;
END
VUSR = ROLENAME;
END
/* Если существует имя роли, мы применим полномочия к этой роли и предоставим эту роль указанному пользователю */
ELSE
/* Нас не интересует роль: полномочия только для пользователя */
VUSR = USR;
/* Выяснение - этот скрипт GRANT или REVOKE */
IF (CMD STARTING WITH 'G') THEN
STUB = 'GRANT';
ELSE
STUB = 'REVOKE ';
IF (ROLENAME IS NOT NULL) THEN
BEGIN
IF (STUB = 'GRANT') THEN
BEGIN
/* Предоставление роли пользователю */
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:DATAEXAMPLESPERMSCRIPT.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:DATAEXAMPLESPERMSCRIPT.SQL;
SQL> COMMIT; SQL> SHOW GRANT;
Вот и все. Вы получите сообщение об ошибке, когда утилита INPUT встретит текст не SQL, напечатанный в OUTPUT, однако это не повлияет на вывод полномочий.
- Создание базы данных с использованием isql
- Управление скриптами вашей схемы
- Создание базы данных
- Пример установочного скрипта
- Создание файлов с блокировкой
- Создание свободно позиционируемых элементов
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- Создание объектов Collection
- 7.4.2.4. Создание своего первого LiveCD
- 4.2. Создание трехмерной модели и построение горизонтальной проекции детали
- 7.4.2. Создание собственного LiveCD
- Создание пользователя и группы на рабочей станции