2012-05-23 3 views
0

오라클에서는 MYTABLE 소유자가 USER1이고 USER2에게 권한을 할당합니다. 그러나 C# 코드에서 여전히 USER2은 테이블에 액세스 할 수 없습니다. 나는 C# 코드에서이 테이블을 쿼리 USER1, 소유자를 사용하는 경우오라클 테이블 권한

, 그것은 말했다 :

가 쿼리를 실행할 수 없습니다 사용자 2가 시도 할 때 오류가 무엇

GRANTEE      OWNER    TABLE_NAME  GRANTOR    PRIVILEGE        GRANTABLE HIERARCHY 
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --------- --------- 
USER2      USER1    MYTABLE   USER1    DELETE         NO  NO   
USER2      USER1    MYTABLE   USER1    SELECT         NO  NO   
USER2      USER1    MYTABLE   USER1    UPDATE         NO  NO   

답변

1

테이블을 쿼리합니까? User2가 발급 한 정확한 쿼리는 무엇입니까?

가장 일반적인 문제점은 User2가 스키마 이름으로 테이블 이름을 한정하지 않는다는 것입니다. 당신이 테이블 이름을 한정하지 않으려면 사용자 2는 기본적으로 사용자 1의 MyTable에 대한 사용자 2의 스키마에 동의어를 만들 수 중,

SELECT * 
    FROM User1.MyTable 

같은 것을 할 필요가

CREATE SYNONYM myTable 
    FOR User1.MyTable 

또는 당신은

CREATE PUBLIC SYNONYM myTable 
    FOR User1.MyTable 

공공 동의어 (그들은 권한에 영향을 미치지 않는다 불구하고 공공 동의어는 모든 사용자가 볼 수 있습니다)를 만들 수 있습니다 또는 당신은 세션 A의 current_schema을 설정할 수 있습니다 당신이이 일을 수행하는 경우

ALTER SESSION SET current_schema = User1 

를 연결 따고는, 사용자 2는 쿼리

SELECT * 
    FROM MyTable 

을 실행하고 User2.MyTableMyTable 해결을 할 수있을 것입니다. 개인 동의어는 가장 작은 공간이며 User2에만 적용되며 MyTable에 대해서만 적용됩니다. 공용 동의어 란 User1.MyTable에 대한 권한을 부여받은 사람이면 스키마 이름으로 테이블 이름을 한정하지 않고도 쿼리 할 수 ​​있음을 의미합니다. current_schema을 변경하면 향후 해당 세션의 모든 규정되지 않은 오브젝트 참조가 현재 사용자의 스키마가 아닌 User1 스키마에서 해결됩니다.

+0

매우 훌륭하고 매우 완벽한 대답입니다. –