Oracle объединяет раздел из процедуры, выдавшей ошибку - PullRequest
0 голосов
/ 13 апреля 2009
  CREATE OR REPLACE PROCEDURE test
  AS
  sql_stmt  VARCHAR2(200);
  BEGIN
     sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
     EXECUTE IMMEDIATE sql_stmt;

  END ;
  /

Приведенная выше процедура дает мне следующую ошибку -

ORA-01031: insufficient privileges
ORA-06512: at "test", line 8
ORA-06512: at line 6

Но если я запускаю команду ALTER непосредственно в командной строке sql, я не получаю никакой ошибки .. Мне интересно, какое разрешение мне нужно предоставить пользователю для выполнения слияния из процедуры.

Ответы [ 4 ]

1 голос
/ 13 апреля 2009

Я исправил проблему с помощью AUTHID CURRENT_USER

CREATE OR REPLACE PROCEDURE test AUTHID CURRENT_USER
  AS
  sql_stmt  VARCHAR2(200);
  BEGIN
     sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
     EXECUTE IMMEDIATE sql_stmt;

  END ;
  /
0 голосов
/ 20 мая 2009

Я использую DDL в хранимых процедурах: чаще всего для обрезания сводных таблиц, которые процедура затем повторно заполняет; время от времени для задач DDLish, таких как переименование столбцов импортируемой таблицы, для соответствия стандартным правилам Oracle для идентификатора или для создания первичных ключей и последовательностей для именованных таблиц. Обычно я использую

dbms_utility.exec_ddl_statement(blah);

вместо

EXECUTE IMMEDIATE blah;

предубеждение, которое я не буду пытаться оправдать. Я скажу, что упакованная процедура, предоставленная и задокументированная Oracle, предполагает, что ее нельзя запрещать повсеместно.

0 голосов
/ 20 мая 2009

Я уверен, что если кто-то создает хранимый процесс ОСОБЕННО для DDL, он понимает, что он фиксируется автоматически.

0 голосов
/ 13 апреля 2009

Примечание: вы никогда не должны использовать DDL в хранимых процедурах. Ниже приведен пример очень, очень плохо спроектированного кода, которого следует избегать.

CREATE OR REPLACE PROCEDURE test
AS
sql_stmt  VARCHAR2(200);
BEGIN
     sql_stmt := 'GRANT ALTER ON daily_table TO your_user';
     EXECUTE IMMEDIATE sql_stmt;
     sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
     EXECUTE IMMEDIATE sql_stmt;
END ;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...