Создать пользователя из строковых переменных в блоке PL / SQL

Я использую Oracle XE с единственной целью разработки приложений PHP, а версия 11g, по-видимому, потеряла инструмент графического интерфейса для управления пользователями, который раньше имел 10g, поэтому я хотел бы подготовить фрагмент кода для создания пользователей из командной строки. Я пытаюсь определить переменные, поэтому мне не нужно вводить одно и то же имя пользователя 16 раз, но я не могу понять синтаксис:

DECLARE
    my_user VARCHAR2(30) := 'foo';
    my_password VARCHAR2(9) := '1234';
BEGIN
    CREATE USER my_user IDENTIFIED BY my_password DEFAULT TABLESPACE users;

    GRANT CONNECT, RESOURCE TO my_user;
    GRANT CREATE DATABASE LINK TO my_user;
    GRANT CREATE MATERIALIZED VIEW TO my_user;
    GRANT CREATE PROCEDURE TO my_user;
    GRANT CREATE PUBLIC SYNONYM TO my_user;
    GRANT CREATE ROLE TO my_user;
    GRANT CREATE SEQUENCE TO my_user;
    GRANT CREATE SYNONYM TO my_user;
    GRANT CREATE TABLE TO my_user;
    GRANT CREATE TRIGGER TO my_user;
    GRANT CREATE TYPE TO my_user;
    GRANT CREATE VIEW TO my_user;

    GRANT SELECT_CATALOG_ROLE TO my_user;
    GRANT SELECT ANY DICTIONARY TO my_user;
END;
/
        CREATE USER my_user IDENTIFIED BY my_password DEFAULT TABLESPACE users;
        *
ERROR en línea 5:
ORA-06550: line 5, column 2:
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge

Запрещено ли использовать оператор CREATE USER из блока PL / SQL, или я просто допустил глупую опечатку? Обязательно ли использовать переменные SQL * Plus?


person Álvaro González    schedule 16.11.2015    source источник


Ответы (1)


PLS-00103: обнаружен символ «СОЗДАТЬ» при ожидании одного из следующих событий:

Вышеупомянутая ошибка связана с тем, что вы используете DDL внутри PL / SQL. Тебе этого не сделать. Вы должны (ab) использовать EXECUTE IMMEDIATE для выполнения операторов DDL в PL / SQL.

Например,

SQL> DECLARE
  2    my_user     VARCHAR2(30) := 'foo';
  3    my_password VARCHAR2(9)  := '1234';
  4  BEGIN
  5    EXECUTE IMMEDIATE 'CREATE USER '||my_user||' IDENTIFIED BY '||my_password;
  6    EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO '||my_user;
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> conn foo/1234@pdborcl
Connected.
SQL> SHOW USER
USER is "FOO"

Краткий справочник из документации ,

Выполнение операторов DDL и SCL в PL / SQL

Только динамический SQL может выполнять следующие типы операторов в программных модулях PL / SQL:

  • Операторы языка определения данных (DDL), такие как CREATE, DROP, GRANT и REVOKE

  • Операторы языка управления сеансом (SCL), такие как ALTER SESSION и SET ROLE

  • Предложение TABLE в заявлении SELECT

Кстати,

Создание пользователей и предоставление привилегий обычно являются задачами администрирования базы данных, которые берет на себя администратор базы данных. Это не частое действие, выполняемое с помощью программы PL / SQL. Администратор базы данных создает пользователей и предоставляет необходимые привилегии как одноразовое действие.

person Lalit Kumar B    schedule 16.11.2015
comment
Громко и ясно, большое спасибо. Думаю, это помогает объяснить, почему переменные SQL * Plus являются таким популярным выбором. - person Álvaro González; 16.11.2015
comment
@ ÁlvaroGonzález Добро пожаловать! Обратите внимание, что это задачи администрирования базы данных, которые обычно не выполняются с помощью программы PL / SQL. Вы создаете пользователя и предоставляете привилегии только один раз. Это необходимо сделать администратору базы данных, обычно не разработчику PL / SQL. Я не знаю ваших точных требований, так что у вас может быть вариант использования ;-) - person Lalit Kumar B; 16.11.2015
comment
Мое точное требование - в городе не должно быть администратора баз данных, но мне все еще нужен Oracle ;-) - person Álvaro González; 16.11.2015
comment
@ ÁlvaroGonzález LOL, удачи с этим. Я бы предпочел сценарии SQL * Plus, объявляйте переменные один раз и используйте их во всем сценарии. Вы можете поместить весь DDL в файл .sql и передать переменные в качестве аргументов. Пожалуйста, отметьте это как ответ, помог бы другим. - person Lalit Kumar B; 16.11.2015