Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.misc -> Using (public) synonyms on views using the Oracle type/object concept
I have problems accessing views containing the Oracle type/object
concept when logged on as something else than the view creator.
Concretely, run the following script and see. Everything created will
be dropped at the end, your database will not be polluted. Substitute
the yourUid and yourPw and yourService with a user having the right to
create users and roles:
CONNECT yourUid/yourPw_at_yourService
CREATE USER test1 IDENTIFIED BY test1;
GRANT CONNECT TO test1;
GRANT RESOURCE TO test1;
GRANT DBA TO test1;
CREATE ROLE test_role;
CREATE USER test2 IDENTIFIED BY test2;
GRANT CONNECT TO test2;
GRANT test_role TO test2;
COMMIT; CONNECT test1/test1_at_layc;
CREATE TABLE t1
(
pk11 INT NOT NULL,
PRIMARY KEY(pk11)
);
GRANT SELECT ON t1 TO test_role;
INSERT INTO t1 VALUES(1);
CREATE TABLE t2
(
pk21 VARCHAR2(1) NOT NULL,
PRIMARY KEY(pk21)
);
GRANT SELECT ON t2 TO test_role;
INSERT INTO t2 VALUES('A'); INSERT INTO t2 VALUES('B'); INSERT INTO t2 VALUES('C'); INSERT INTO t2 VALUES('D');
CREATE OR REPLACE TYPE my_ty AS OBJECT
(
pk21 VARCHAR2(1)
);
.
/
CREATE OR REPLACE TYPE my_ty_list AS TABLE OF my_ty;
/
CREATE OR REPLACE TYPE v1_ty AS OBJECT
(
pk11 NUMBER
, twoers my_ty_list
);
/
CREATE OR REPLACE VIEW v1 OF v1_ty
WITH OBJECT oid(pk11)
AS SELECT pk11
, CAST( MULTISET( SELECT pk21 FROM t2 ) AS my_ty_list ) twoers
GRANT SELECT ON v1 TO test_role;
SELECT *
FROM t1;
SELECT *
FROM t2;
SELECT pk11
FROM v1;
/*
Works fine, because logged on as creator
*/
SELECT pk11
, CAST( MULTISET( SELECT pk21 FROM t2 ) AS my_ty_list ) twoers
COMMIT;
CREATE PUBLIC SYNONYM t1 FOR t1; CREATE PUBLIC SYNONYM t2 FOR t2; CREATE PUBLIC SYNONYM v1 FOR v1; CREATE PUBLIC SYNONYM v1_ty FOR v1_ty;
COMMIT; CONNECT test2/test2_at_layc;
SELECT *
FROM t1;
SELECT *
FROM t2;
SELECT pk11
FROM v1;
/*
Gives the error:
*
ERROR at line 2:
ORA-00904: invalid column name
*/
SELECT pk11
, CAST( MULTISET( SELECT pk21 FROM t2 ) AS my_ty_list ) twoers
/*
Gives the error:
) AS my_ty_list *
CONNECT yourUid/yourPw_at_yourService
DROP USER test1 CASCADE;
DROP USER test2 CASCADE;
DROP ROLE test_role;
DROP PUBLIC SYNONYM t1; DROP PUBLIC SYNONYM t2; DROP PUBLIC SYNONYM v1; DROP PUBLIC SYNONYM v1_ty;
COMMIT; Received on Fri Sep 28 2001 - 04:19:52 CDT