Я не могу придумать простой способ сделать это в 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...