Другая возможность управлять тем, кто может выполнять выборки и вносить изменения в данные, состоит в использовании процедур, функций и пакетов.
Создав процедуру, которую вы будете вызывать при необходимости внесения изменений в таблицу, можно дать возможность другим пользователям вызывать эту процедуру каждый раз, когда им потребуется изменить данные в таблице.
Эту процедуру смогут вызывать пользователи Oracle с соответствующими привилегиями. Однако другим пользователям Oracle нет необходимости иметь какие-либо привилегии на таблицы, используемые процедурой.
В следующем примере кода показана простая процедура для удаления данных в таблице delegates. Пользователю TAEJEN дана привилегия объектного уровня execute, чтобы он имел возможность вызывать эту процедуру:
SQL> CREATE OR REPLACE PROCEDURE deletc_delegate (p_delegate_id, IN delegates. d_delegate_id%.
TYPE).
IS.
BEGIN.
DELETE FROM delegates.
WHERE d_delegate_id=p_delegate Jd;
END;
Procedure created.
SQL>GRANT EXEGUTE ON delete_delegate TO taejen;
Grant succeeded.
SQL> CONNECT taejen/taejen.
Connected.
SQL> EXECUTE asgend. delete_delegate (l);
PL/SQL procedure successfullycompleted.
SQL>
SQL> SHOW USER.
user is «TAEJEN» .
SQL> SELECT * FROM ascend. delegates;
SELECT * FROM ascend.delegates.
*.
ERROR at line 1:
OBA-942: table or view does not exist.
SQL>
В предыдущем примере показано, что пользователь с привилегией EXECUTE может вызвать процедуру (используя перед именем процедуры префикс владельца таким же образом, как вызываются и другие таблицы пользователя Oracle), но пользователь TAEJEN базы данных Oracle не может непосредственно обращаться к таблицам — никакие прямые привилегии на таблицы, используемые процедурой, пользователю TAEJEN даны не были.
Таким же способом, как создаются синонимы для таблиц, можно создать синоним для процедуры, чтобы избежать необходимости определять в прикладном коде владельца процедуры.