воскресенье, 30 ноября 2014 г.

Пользователь SYS

Для пользователя 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

Комментариев нет: