Как обнаружить оператор DDL в скрипте и выйти - PullRequest
0 голосов
/ 03 июня 2018

При запуске сценария через SQLPLUS из KSH для базы данных Oracle 11.2.0.4 или выше в Linux, возможно ли обнаружить оператор DDL, завершить и откатить все предыдущие операторы, не являющиеся DDL?Таким образом, было бы что-то вроде этого, но улучшено, чтобы останавливаться на первом DDL.

    WHENEVER SQLERROR EXIT ROLLBACK
    @script.sql

Есть ли какой-то способ настроить обработку исключений в PLSQL для немедленного завершения до выполнения первого оператора DDL?

1 Ответ

0 голосов
/ 03 июня 2018

Я не могу придумать простой способ сделать это в SQL * Plus, и это, вероятно, самая главная причина, по которой у нас всегда работают две учетные записи: один пользователь схемы, который владеет таблицами и выполняет все DDL, и приложениепользователь, у которого есть полные права чтения и записи на таблицах.Сценарий запускается пользователем приложения и вообще не может выполнить какой-либо DDL.

Однако, если вы настаиваете, вы можете создать триггер DDL

CREATE OR REPLACE TRIGGER my_ddl_watchdog 
  BEFORE DDL ON SCHEMA
DECLARE
  l_program v$session.program%type;
BEGIN
  SELECT program
    INTO l_program
    FROM v$session 
   WHERE audsid = sys_context('userenv', 'sessionid'); 
  IF lower(l_program) LIKE 'sqlplus%' THEN
    RAISE_APPLICATION_ERROR(-20000, 'sqlplus may not do DDL');
  END IF;
END my_ddl_watchdog; 
/

, который срабатывает, как только приложениевызываемый sqlplus пытается сделать DDL:

sqlplus user/pwf@localhost:1521/orcl

WHENEVER SQLERROR EXIT ROLLBACK;       

INSERT INTO bla VALUES (1);
1 row created.

DROP TABLE bla;
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: sqlplus may not do DDL
Disconnected from Oracle Database...
...