linux - 如何检测脚本中的 DDL 语句并退出
问题描述
当通过 SQLPLUS 从 KSH 中针对 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...
推荐阅读
- hyperledger-fabric - 如何将 HyperLedger composer Business 网络与 Hyperledger explorer 集成?
- delphi - 减少绘制的TChart点数
- android - 在不重新创建活动的情况下更改应用程序语言运行时间
- angular - Angular6 - 无法解析 selenium-webdriver\lib 中的“fs”
- node.js - 如何使用后端进行 MDC Web?(node.js 后端文件)
- android - 如何使用 Mockk 模拟和测试 RxJava/RxAndroid?
- java - Java.lang.ClassCastException:模型类无法转换为模型类
- r - R Markdown:隐藏剧透文本(悬停在文本元素上)
- php - 查询接口在 PHP 中究竟是如何工作的
- azure-web-app-service - 使用 Visual Studio Team Services 为控制台应用程序创建构建管道