Fra*_*nco 0 linux oracle ksh plsql sqlplus
当在KSH中针对Linux上的Oracle 11.2.0.4或更高版本的数据库通过SQLPLUS运行脚本时,是否可以检测DDL语句,退出并回滚所有以前的非DDL语句?所以这将是这样的,但增强了停止第一个DDL.
WHENEVER SQLERROR EXIT ROLLBACK
@script.sql
Run Code Online (Sandbox Code Playgroud)
有没有办法在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;
/
Run Code Online (Sandbox Code Playgroud)
一旦名为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...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |