如何检测脚本中的 DDL 语句并退出

How to detect a DDL statement in a script and exit

当 运行 在 KSH 中通过 SQLPLUS 针对 Linux 上的 Oracle 11.2.0.4 或更高版本的数据库执行脚本时,是否可以检测到 DDL 语句、退出并回滚所有以前的非DDL 语句?所以它会是这样的,但增强了在第一个 DDL 上停止。

    WHENEVER SQLERROR EXIT ROLLBACK
    @script.sql

有什么方法可以在 PLSQL 中设置异常处理,使其在第一个 DDL 语句执行之前立即退出?

我想不出在 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...