Для пользователя SYS нет READ ONLY транзакций и мутирующих таблиц.
Для тестового кода
CLEAR SCREEN
DROP TABLE tab1 PURGE;
CREATE TABLE tab1 (
id NUMBER
);
INSERT INTO tab1 VALUES(1);
COMMIT;
SET TRANSACTION READ ONLY;
UPDATE tab1 SET ID = 2;
COMMIT;
CREATE OR REPLACE FUNCTION bad_func RETURN NUMBER AS
BEGIN
UPDATE system.tab1 SET ID = -1;
RETURN 1;
END;
/
SHOW ERRORS
INSERT INTO tab1 SELECT bad_func FROM dual;
COMMIT;
SELECT * FROM tab1;
под пользователем sys имеем результаты:
Table dropped
Table created
1 row inserted
Commit complete
Transaction set
1 row updated
Commit complete
Function created
No errors for FUNCTION SYS.BAD_FUNC
1 row inserted
Commit complete
ID
----------
-1
1
Для пользователя SYSTEM
Table dropped
Table created
1 row inserted
Commit complete
Transaction set
UPDATE tab1 SET ID = 2
ORA-01456: вставка/удаление/обновление данных невозможны внутри READ ONLY транзакции
Commit complete
Function created
No errors for FUNCTION SYSTEM.BAD_FUNC
INSERT INTO tab1 SELECT bad_func FROM dual
ORA-04091: таблица SYSTEM.TAB1 изменяется, триггер/функция может не заметить это
ORA-06512: на "SYSTEM.BAD_FUNC", line 3
Commit complete
ID
----------
1
Но в тоже время при работе с триггерами в таблицах чужих схем ошибка сохраняется:
CREATE OR REPLACE TRIGGER tab1_trg
AFTER INSERT OR UPDATE ON system.tab1
FOR EACH ROW
DECLARE
l_count NUMBER(10);
BEGIN
SELECT COUNT(*)
INTO l_count
FROM tab1;
END;
/
SHOW ERRORS
INSERT INTO system.tab1 VALUES (2);
На таблице в схеме SYS нельзя создавать триггеров, пишет ошибку
ORA-04089: нельзя создать триггеры на объектах, принадлежащих SYS
Комментариев нет:
Отправить комментарий