Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
trak
Member

Откуда: spb.ru
Сообщений: 802
Вот такая штука:
/* $Header$ 
   $Log$
 */

DROP TRIGGER XXX.tr_cmn_audit_object_view;
DROP VIEW XXX.audit_object_view;

CREATE VIEW XXX.audit_object_view
AS
   SELECT owner, object_name, 'SELECT' AS action
     FROM dba_obj_audit_opts
    WHERE sel != '-/-'
   UNION ALL
   SELECT owner, object_name, 'UPDATE' AS action
     FROM dba_obj_audit_opts
    WHERE upd != '-/-'
   UNION ALL
   SELECT owner, object_name, 'INSERT' AS action
     FROM dba_obj_audit_opts
    WHERE ins != '-/-'
   UNION ALL
   SELECT owner, object_name, 'DELETE' AS action
     FROM dba_obj_audit_opts
    WHERE del != '-/-'
/


CREATE TRIGGER XXX.tr_cmn_audit_object_view
   INSTEAD OF INSERT OR UPDATE OR DELETE
   ON XXX.audit_object_view
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
/*
ALT Auditing ALTER WHENEVER SUCCESSFUL/UNSUCCESSFUL
AUD Auditing AUDIT WHENEVER SUCCESSFUL/UNSUCCESSFUL
COM Auditing COMMENT WHENEVER SUCCESSFUL/UNSUCCESSFUL
DEL Auditing DELETE WHENEVER SUCCESSFUL/UNSUCCESSFUL
GRA Auditing GRANT WHENEVER SUCCESSFUL/UNSUCCESSFUL
IND Auditing INDEX WHENEVER SUCCESSFUL/UNSUCCESSFUL
INS Auditing INSERT WHENEVER SUCCESSFUL/UNSUCCESSFUL
LOC Auditing LOCK WHENEVER SUCCESSFUL/UNSUCCESSFUL
REN Auditing RENAME WHENEVER SUCCESSFUL/UNSUCCESSFUL
SEL Auditing SELECT WHENEVER SUCCESSFUL/UNSUCCESSFUL
UPD Auditing UPDATE WHENEVER SUCCESSFUL/UNSUCCESSFUL
REF Auditing REFERENCE WHENEVER SUCCESSFUL/UNSUCCESSFUL (not used)
EXE Auditing EXECUTE WHENEVER SUCCESSFUL/UNSUCCESSFUL
REA Auditing READ WHENEVER SUCCESSFUL/UNSUCCESSFUL
*/
BEGIN
   IF DELETING
   THEN
      BEGIN
         EXECUTE IMMEDIATE    'NOAUDIT '
                           || :OLD.action
                           || ' ON '
                           || :OLD.owner
                           || '.'
                           || :OLD.object_name;
      EXCEPTION
         WHEN OTHERS
         THEN
            raise_application_error (-20702,
                                        'При попытке отключить аудит ['
                                     || :OLD.action
                                     || '] для объекта ['
                                     || :OLD.owner
                                     || '.'
                                     || :OLD.object_name
                                     || ' произошла ошибка :'
                                     || CHR (10)
                                     || DBMS_UTILITY.format_error_stack
                                    );
      END;
   ELSIF INSERTING
   THEN
      BEGIN
         EXECUTE IMMEDIATE    'AUDIT '
                           || :NEW.action
                           || ' ON '
                           || :NEW.owner
                           || '.'
                           || :NEW.object_name;
      EXCEPTION
         WHEN OTHERS
         THEN
            raise_application_error (-20702,
                                        'При попытке включить аудит ['
                                     || :NEW.action
                                     || '] для объекта ['
                                     || :NEW.owner
                                     || '.'
                                     || :NEW.object_name
                                     || ' произошла ошибка :'
                                     || CHR (10)
                                     || DBMS_UTILITY.format_error_stack
                                    );
      END;
   ELSIF UPDATING
   THEN
      raise_application_error
          (-20702,
           'Feature not yet impemented: updating view gis.audit_object_view.'
          );
   END IF;
END tr_cmn_audit_object_view;
/


При попытке:
TRAK@XXX>delete from gis.audit_object_view where owner='TRAK' and OBJECT_NAME='A1';
delete from gis.audit_object_view where owner='TRAK' and OBJECT_NAME='A1'
                *
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view


Ничего не понимаю.
Я что-то упустил важное?

---
Гроб карманов не имеет.
10 май 07, 10:01    [4118964]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Имя схемы очепятано?
Триггер без ошибок?
10 май 07, 10:26    [4119075]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
trak

Ничего не понимаю.
Я что-то упустил важное?


Если нигде не опечатались с именами схем, то должно работать. Попробуйте еще раз, и если не выйдет - полный листинг из SQL*Plus.
10 май 07, 10:29    [4119089]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
trak
Member

Откуда: spb.ru
Сообщений: 802
Bogdanov Andrey
trak

Ничего не понимаю.
Я что-то упустил важное?


Если нигде не опечатались с именами схем, то должно работать. Попробуйте еще раз, и если не выйдет - полный листинг из SQL*Plus.

Так нормально?
GIS@renovate >@AUDIT_OBJECT_VIEW.vw
GIS@renovate >
GIS@renovate >
GIS@renovate >/* $Header$
GIS@renovate >	 $Log$
GIS@renovate > */
GIS@renovate >
GIS@renovate >DROP TRIGGER gis.tr_cmn_audit_object_view;

Trigger dropped.

Elapsed: 00:00:00.06
GIS@renovate >DROP VIEW gis.audit_object_view;

View dropped.

Elapsed: 00:00:00.02
GIS@renovate >
GIS@renovate >CREATE VIEW gis.audit_object_view
  2  AS
  3  	SELECT owner, object_name, 'SELECT' AS action
  4  	  FROM dba_obj_audit_opts
  5  	 WHERE sel != '-/-'
  6  	UNION ALL
  7  	SELECT owner, object_name, 'UPDATE' AS action
  8  	  FROM dba_obj_audit_opts
  9  	 WHERE upd != '-/-'
 10  	UNION ALL
 11  	SELECT owner, object_name, 'INSERT' AS action
 12  	  FROM dba_obj_audit_opts
 13  	 WHERE ins != '-/-'
 14  	UNION ALL
 15  	SELECT owner, object_name, 'DELETE' AS action
 16  	  FROM dba_obj_audit_opts
 17  	 WHERE del != '-/-'
 18  /

View created.

Elapsed: 00:00:00.14
GIS@renovate >
GIS@renovate >
GIS@renovate >CREATE TRIGGER gis.tr_cmn_audit_object_view
  2  	INSTEAD OF INSERT OR UPDATE OR DELETE
  3  	ON gis.audit_object_view
  4  DECLARE
  5    PRAGMA AUTONOMOUS_TRANSACTION;
  6  /*
  7  ALT Auditing ALTER WHENEVER SUCCESSFUL/UNSUCCESSFUL
  8  AUD Auditing AUDIT WHENEVER SUCCESSFUL/UNSUCCESSFUL
  9  COM Auditing COMMENT WHENEVER SUCCESSFUL/UNSUCCESSFUL
 10  DEL Auditing DELETE WHENEVER SUCCESSFUL/UNSUCCESSFUL
 11  GRA Auditing GRANT WHENEVER SUCCESSFUL/UNSUCCESSFUL
 12  IND Auditing INDEX WHENEVER SUCCESSFUL/UNSUCCESSFUL
 13  INS Auditing INSERT WHENEVER SUCCESSFUL/UNSUCCESSFUL
 14  LOC Auditing LOCK WHENEVER SUCCESSFUL/UNSUCCESSFUL
 15  REN Auditing RENAME WHENEVER SUCCESSFUL/UNSUCCESSFUL
 16  SEL Auditing SELECT WHENEVER SUCCESSFUL/UNSUCCESSFUL
 17  UPD Auditing UPDATE WHENEVER SUCCESSFUL/UNSUCCESSFUL
 18  REF Auditing REFERENCE WHENEVER SUCCESSFUL/UNSUCCESSFUL (not used)
 19  EXE Auditing EXECUTE WHENEVER SUCCESSFUL/UNSUCCESSFUL
 20  REA Auditing READ WHENEVER SUCCESSFUL/UNSUCCESSFUL
 21  */
 22  BEGIN
 23  	IF DELETING
 24  	THEN
 25  	   BEGIN
 26  	      EXECUTE IMMEDIATE    'NOAUDIT '
 27  				|| :OLD.action
 28  				|| ' ON '
 29  				|| :OLD.owner
 30  				|| '.'
 31  				|| :OLD.object_name;
 32  	   EXCEPTION
 33  	      WHEN OTHERS
 34  	      THEN
 35  		 raise_application_error (-20702,
 36  					     'При попытке отключить аудит ['
 37  					  || :OLD.action
 38  					  || '] для объекта ['
 39  					  || :OLD.owner
 40  					  || '.'
 41  					  || :OLD.object_name
 42  					  || ' произошла ошибка :'
 43  					  || CHR (10)
 44  					  || DBMS_UTILITY.format_error_stack
 45  					 );
 46  	   END;
 47  	ELSIF INSERTING
 48  	THEN
 49  	   BEGIN
 50  	      EXECUTE IMMEDIATE    'AUDIT '
 51  				|| :NEW.action
 52  				|| ' ON '
 53  				|| :NEW.owner
 54  				|| '.'
 55  				|| :NEW.object_name;
 56  	   EXCEPTION
 57  	      WHEN OTHERS
 58  	      THEN
 59  		 raise_application_error (-20702,
 60  					     'При попытке включить аудит ['
 61  					  || :NEW.action
 62  					  || '] для объекта ['
 63  					  || :NEW.owner
 64  					  || '.'
 65  					  || :NEW.object_name
 66  					  || ' произошла ошибка :'
 67  					  || CHR (10)
 68  					  || DBMS_UTILITY.format_error_stack
 69  					 );
 70  	   END;
 71  	ELSIF UPDATING
 72  	THEN
 73  	   raise_application_error
 74  	       (-20702,
 75  		'Feature not yet impemented: updating view gis.audit_object_view.'
 76  	       );
 77  	END IF;
 78  END tr_cmn_audit_object_view;
 79  /

Trigger created.

Elapsed: 00:00:00.03
GIS@renovate >
GIS@renovate >delete from gis.audit_object_view where owner='TRAK' and OBJECT_NAME='A1';
delete from gis.audit_object_view where owner='TRAK' and OBJECT_NAME='A1'
                *
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view


Elapsed: 00:00:00.16
GIS@renovate >spool off
10 май 07, 11:05    [4119356]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Oracle9i. Database Error Messages. Release 2 (9.2). March 2002. Part No. A96525-01

ORA-01732 data manipulation operation not legal on this view

Cause: An attempt was made to use an UPDATE, INSERT, or DELETE
statement on a view that contains expressions or functions or was derived from
more than one table. If a join operation was used to create the view or the view
contains virtual columns derived from functions or expressions, then the view
may only be queried.

Action: UPDATE, INSERT, or DELETE rows in the base tables instead and
restrict the operations on the view to queries.


Выполните:
select * from all_updatable_columns
where owner = 'GIS'
  and table_name = 'AUDIT_OBJECT_VIEW'
и убедитесь, что через ваше VIEW можно/нельзя выполнять операции DML
10 май 07, 11:15    [4119440]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
Alphisik
Member

Откуда: Алматы
Сообщений: 4
Возможно я ошибаюсь, но все таки:
ORA-01732 data manipulation operation not legal on this view

Cause: An attempt was made to use an UPDATE, INSERT, or DELETE statement on a view that contains expressions or functions or was derived from more than one table. If a join operation was used to create the view or the view contains virtual columns derived from functions or expressions, then the view may only be queried.

Вьюшка gis.audit_object_view построенна на, опять же вьюшке, dba_obj_audit_opts - столбцы которой являются выражениями с использованием функций.
10 май 07, 11:19    [4119472]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
trak
Member

Откуда: spb.ru
Сообщений: 802
SQL*Plus
Oracle9i. Database Error Messages. Release 2 (9.2). March 2002. Part No. A96525-01

ORA-01732 data manipulation operation not legal on this view

Cause: An attempt was made to use an UPDATE, INSERT, or DELETE
statement on a view that contains expressions or functions or was derived from
more than one table. If a join operation was used to create the view or the view
contains virtual columns derived from functions or expressions, then the view
may only be queried.

Action: UPDATE, INSERT, or DELETE rows in the base tables instead and
restrict the operations on the view to queries.


Выполните:
select * from all_updatable_columns
where owner = 'GIS'
  and table_name = 'AUDIT_OBJECT_VIEW'
и убедитесь, что через ваше VIEW можно/нельзя выполнять операции DML


А вот не так все просто. INSERT-то работает!!!
При том, что:

select * from all_updatable_columns
where owner = 'GIS'
  3    and table_name = 'AUDIT_OBJECT_VIEW'
  4  /

OWNER                          TABLE_NAME                     COLUMN_NAME                    UPD INS DEL
------------------------------ ------------------------------ ------------------------------ --- --- ---
GIS                            AUDIT_OBJECT_VIEW              OWNER                          NO  NO  NO
GIS                            AUDIT_OBJECT_VIEW              OBJECT_NAME                    NO  NO  NO
GIS                            AUDIT_OBJECT_VIEW              ACTION                         NO  NO  NO

Elapsed: 00:00:00.02
10 май 07, 11:21    [4119487]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
trak

А вот не так все просто. INSERT-то работает!!!


Не поленился, прогнал все это у себя на базе.
На 8.1.7.3.0 все работает
А вот на 9.2.0.6.0 и 10.2.0.1.0 insert работает, а при удалении выдает
ORA-01031: insufficient privileges
Хотя прямой noaudit - проходит.
10 май 07, 13:17    [4120373]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
trak
Member

Откуда: spb.ru
Сообщений: 802
Bogdanov Andrey
trak

А вот не так все просто. INSERT-то работает!!!


Не поленился, прогнал все это у себя на базе.
На 8.1.7.3.0 все работает
А вот на 9.2.0.6.0 и 10.2.0.1.0 insert работает, а при удалении выдает
ORA-01031: insufficient privileges
Хотя прямой noaudit - проходит.

Мнда, спасибо за тесты. Что я могу сказать, тут ведь даже и TAR-то открывать вроде и повода нету.
10 май 07, 13:20    [4120401]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
У Вас-то версия какая?
10 май 07, 14:47    [4121114]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01732: — Чегой-то оно так себя ведет? Тригер есть  [new]
trak
Member

Откуда: spb.ru
Сообщений: 802
Jannny
У Вас-то версия какая?

Мнда, затупил я :)
Извините.
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production 64-bit :) Люлекс-шмулекс
10 май 07, 14:50    [4121144]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить