ORACLE9i: Mat-Views mit fast refresh on commit

Hallo,

ich möchte eine materialized view erstellen,
die sich bei jeder änderung der Ursprungstabelle aktualisiert.
Ursprungstabelle und M-View liegen in 2 verschiedenen Schemas
Schema STRMADMIN besitzt die Ursprungstabelle
Schema STRREPLIC besitzt die Mat-View

beide User erhielten für den Test folgende System-Privilegien:
ON COMMIT REFRESH
QUERY REWRITE (auch wenn ich „disable query rewrite“ in der Mat-View stehen habe)

ORACLE-Version:
Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production

Nun bin ich wie folgt vorgegangen:

als User: strmadmin

CREATE TABLE testtab
(
CODIGO NUMBER NOT NULL,
NOMBRE VARCHAR2(15),
)
grant select on strmadmin.testtab to strreplic;

CREATE MATERIALIZED VIEW LOG ON strmadmin.testtab WITH ROWID INCLUDING NEW VALUES;


als User strreplic:

CREATE MATERIALIZED VIEW STRREPLIC.testtab
REFRESH FORCE WITH ROWID
DISABLE QUERY REWRITE AS
SELECT * FROM „STRMADMIN“.testtab

ALTER MATERIALIZED VIEW strreplic.testtab REFRESH FAST on commit;


Nun wollte ich einen Satz in die Tabelle einfügen

Als User strmadmin (owner der Tabelle testtab):
insert into strmadmin.testtab values(1,‚otto‘);
commit;
=> beim Commit erhielt ich den Fehler
ORA-12018: following error encountered during code generation for „STRREPLIC“.„TESTTAB“
ORA-00942: table or view does not exist

Als User sys:
insert into strmadmin.testtab values(1,‚otto‘);
commit;
=>
ORA-12018: following error encountered during code generation for „STRREPLIC“.„TESTTAB“
ORA-01031: insufficient privileges

Weiss jemand, was ich hier nicht beachtet habe ?
Wer benötigt hier noch welches Recht?
Auch wenn ich dem User strmadmin ein „grant all“ auf die MView gebe, erhalte ich den Fehler

liebe Grüsse
Regine

Hallo Regine,

ich habs mal durchgespielt und es funktioniert.

Habe lediglich ein paar Schreibfehler korrigiert und um den Materialized View anzulegen brauchte ich DBA Qualitäten (zumindest hats mit denen geklappt)

Möglicherweise bist auch Du irgendwo auf einen Fehler gestoßen und hast die Meldung übersehen. Schau einfach nochmal in der Enterprise Manager Console drüber.

Gruß

peter

Hallo Peter,

danke für Deine schnelle Antwort.
Leider klappt es bei mir immernoch nicht. Irgendwas hast Du was ich nicht habe (vielleicht mehr Glück)

Also, vorher hatte ich das TOAD benutzt, um die Befehle abzusetzen.
Um evtl. Tool-Fehler auszuschliessen, habe ich jetzt alles über sqlplus abgesetzt:

SQL> connect strmadmin@15ktest01
Conectado.
SQL> CREATE TABLE testtab
2 (
3 CODIGO NUMBER NOT NULL,
4 NOMBRE VARCHAR2(15)
5 )
6 ;

Tabla creada.

SQL> grant select on strmadmin.testtab to strreplic;

Concesión terminada correctamente.

SQL> CREATE MATERIALIZED VIEW LOG ON strmadmin.testtab WITH ROWID INCLUDING NEW VALUES;

Log de vista materializada creado.

SQL> connect strreplic@15ktest01
Conectado.
SQL> CREATE MATERIALIZED VIEW STRREPLIC.testtab
2 REFRESH FORCE WITH ROWID
3 DISABLE QUERY REWRITE AS
4 SELECT * FROM „STRMADMIN“.testtab;

Vista materializada creada.

SQL> ALTER MATERIALIZED VIEW strreplic.testtab REFRESH FAST on commit;

Vista materializada modificada.

SQL> connect strmadmin@15ktest01
Conectado.
SQL> insert into strmadmin.testtab values(1,‚otto‘);

1 fila creada.

SQL> commit;
commit
*
ERROR en línea 1:
ORA-12018: following error encountered during code generation for
„STRREPLIC“.„TESTTAB“
ORA-00942: table or view does not exist

Dann habe ich die M-View als User SYS erstellt:

SQL> connect sys@15ktest01 as sysdba
Conectado.

SQL> CREATE MATERIALIZED VIEW testtab
2 REFRESH FORCE WITH ROWID
3 DISABLE QUERY REWRITE AS
4 SELECT * FROM „STRMADMIN“.testtab ;

Vista materializada creada.

SQL> ALTER MATERIALIZED VIEW strreplic.testtab REFRESH FAST on commit;

Vista materializada modificada.

SQL> insert into strmadmin.testtab values(1,‚otto‘);

1 fila creada.

SQL> commit;
commit
*
ERROR en línea 1:
ORA-12018: following error encountered during code generation for
„STRREPLIC“.„TESTTAB“
ORA-01031: insufficient privileges

Was für ein Unterschied gibt es bei Deinen Tests?

Gruss
Regine

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Regine

hast Du dem User die Rechte auf MLOG$_TESTTAB gegeben?

Gruß

Peter

1 Like

Danke, das war´s gewesen ! :smile:))))


SQL> connect strmadmin@15ktest01

SQL> select object_name from user_objects where object_type=‚TABLE‘ and object_name like ‚MLOG%‘;

OBJECT_NAME

MLOG$_TESTTAB

SQL> grant all on MLOG$_TESTTAB to strreplic;

Concesión terminada correctamente.

SQL> insert into strmadmin.testtab values(1,‚otto‘);

1 fila creada.

SQL> commit;

Validación terminada.

SQL> connect strreplic@15ktest01
Conectado.
SQL> select * from testtab;

CODIGO NOMBRE


1 otto

Vielen Dank, Du warst mir eine grosse Hilfe.
Dies hatte ich in den Dokus nicht gesehen und da wäre ich nie drauf gekommen

viele Grüsse
Regine

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]