В лекции №2 вставляю модуль данных. При попытке заменить name на fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? |
Администрирование InterBase: безопасность БД
Права
Добавление нового пользователя еще не означает, что он сможет работать с БД. Чтобы он мог с ней работать, ему необходимо также выделить какие то права. Права в InterBase раздаются пользователям и ролям (и даже хранимым процедурам и триггерам) на какие либо действия с отдельными объектами БД. Под объектами подразумеваются таблицы и их столбцы, просмотры и хранимые процедуры. Права могут быть такими:
- Для таблиц и их полей команды SELECT, INSERT, UPDATE, DELETE и REFERENCES (право на создание ограничений внешнего ключа FOREIGN KEY для данной таблицы. Если таблица содержит внешний ключ, а пользователь должен иметь право на изменение таблицы, то это право ему необходимо также предоставить).
- Для просмотров VIEW команды SELECT, INSERT, UPDATE и DELETE.
- Для хранимых процедур команда EXECUTE.
Таким образом, пользователю можно предоставить, например, права на изменение каких то отдельных столбцов; на другие столбцы только просмотр; возможность добавлять новую запись, но без возможности ее удалить. Могут быть пользователи с правами только на просмотр определенных таблиц или, наоборот, с полными правами на все объекты БД. Раздаются права командой GRANT.
Предоставлять пользователям права удобней утилитой IBConsole. Загрузите IBConsole, войдите в локальный сервер и базу данных First. Дадим пользователю PUPKIN (которого мы создали в "Введение в клиент-серверные БД. InterBase" ) права на просмотр таблицы Tovar. Откройте окно Interactive SQL и введите следующую команду:
GRANT SELECT ON TOVAR TO PUPKIN;
После нажатия кнопки Execute Query, пользователь PUPKIN получит права на просмотр этой таблицы. Убедиться в этом можно, выделив в IBConsole таблицу Tovar, щелкнув по ней правой кнопкой и выбрав команду Properties. Перейдем на вкладку Permission:
Как видим, пользователь SYSDBA имеет на таблицу все права, тогда как пользователь PUPKIN - только на чтение. И еще мы можем сделать вывод, что если пользователи и их пароли хранятся в системной БД InterBase, то их права на объекты рабочей БД хранятся в этой самой БД.
Значок открытой руки в правах пользователя SYSDBA означает, что эти права могут передаваться другим пользователям. Дадим пользователю PUPKIN права на модификацию записей, с возможностью передачи этого права другим пользователям. Для этого существует дополнительный оператор WITH GRANT OPTION. Снова откроем Interactive SQL и введем следующую команду:
GRANT UPDATE ON TOVAR TO PUPKIN WITH GRANT OPTION;
Если мы снова откроем вкладку Permission таблицы Tovar, то убедимся, что PUPKIN теперь имеет право не только изменять записи таблицы, но и передавать это право другим пользователям. Причем каждый пользователь может передавать лишь те права или их часть, которые есть у него самого.
Чтобы предоставить пользователю права на отдельные столбцы в таблице, их нужно перечислить в скобках:
GRANT UPDATE (FNAME, FTYPE, FCENA) ON FOOD TO PUPKIN;
Предоставление прав для списка столбцов может быть только на команды UPDATE и PREFERENCES, для других команд необходимо указывать всю таблицу. Если пользователю требуется предоставить сразу несколько различных прав на таблицу, эти права можно указать через запятую:
GRANT SELECT, INSERT, UPDATE ON PRIM_1 TO PUPKIN;
Через запятую можно указать и список пользователей:
GRANT SELECT, INSERT ON DAYS TO PUPKIN, MISHA;
Чтобы предоставить пользователю ВСЕ права на объект, можно использовать оператор ALL:
GRANT ALL ON SKLAD TO PUPKIN;
А чтобы предоставить какое то право ВСЕМ зарегистрированным пользователям, можно воспользоваться "виртуальным" пользователем PUBLIC:
GRANT ALL ON SDELKI TO PUBLIC;
Права можно не только дать, но и отнять. Делается это командой REVOKE, которая является копией GRANT, только с обратным действием (вместо TO <пользователь> синтаксис использует FROM <пользователь>). Например, снять все права у всех пользователей на таблицу Sdelki можно командой:
REVOKE ALL ON SDELKI FROM PUBLIC;
Пользователь SYSDBA при этом прав на таблицу не потеряет.
Роли
Когда в организации работает множество пользователей, они, как правило, разбиваются на группы. Например, несколько бухгалтеров с одинаковыми правами. Чтобы не терять время на создание одинаковых прав для нескольких пользователей, в InterBase имеется механизм ролей. При пользовании этим механизмом, существует четыре последовательности действий:
- Создать роль.
- Присвоить этой роли необходимые права.
- Назначить нужным пользователям эту роль.
- При соединении с БД указать не только имя пользователя и пароль, но и его роль.
Выполним эту последовательность в окне Interactive SQL:
CREATE ROLE BUH; /*Создаем роль*/ GRANT ALL ON SDELKI TO BUH; /*присваиваем ей права*/ GRANT BUH TO PUPKIN; /*Предоставляем роль пользователю*/
Теперь, если мы выделим в дереве серверов в нашей БД раздел Roles, то увидим новую роль BUH:
А если щелкнуть по BUH в правой части окна правой копкой и выбрать команду Properties, мы увидим, что на эту роль имеет право пользователь PUPKIN. Чтобы подключить пользователя PUPKIN к БД в контексте роли, а не как просто пользователя, в параметрах компонента IBDatabase нужно будет указать следующие параметры:
user_name=pupkin password=qwerty sql_role_name=buh lc_ctype=WIN1251
Это сработает только в том случае, если данному пользователю действительно присвоена эта роль. Таким образом, в клиентском приложении можно сделать гибкую систему подключений пользователя: как простого пользователя с одними правами, и как пользователя в контексте роли с другими правами.
Если же мы подключаемся к БД другим образом, например, через SQL -скрипт, то параметры подключения могут выглядеть иначе:
CONNECT C:\DATABASES\FIRST.GDB USER PUPKIN ROLE BUH PASSWORD qwerty;
Удаляется роль командой DROP, при этом все права роли на объекты утрачиваются:
DROP ROLE BUH;