2008-10-13 5 views
13

에서 사용자에게 추가 스키마에 대한 액세스 권한을 부여 Alice의 스키마 (즉, 모든 테이블)에 적용 할 수 있지만 실행 권한 및 sysdba 또는 Alice로 실행할지 여부는 확실하지 않습니다.올바른 방법은 내가 모두 SQLPLUS에서 SYSDBA로서 다음 명령을 실행하여 생성, 오라클에 두 명의 사용자 밥과 앨리스가 오라클

참조 자료에 대한 유용한 정보를 얻으시길 바랍니다. 인터넷이나 "Oracle Database 10g The Complete Reference"에서 좋은 답변을 얻을 수없는 것 같습니다. 내 책상.

답변

20

AFAIK 개체를 한 번에 하나씩해야합니다.

일반적으로 당신의 라인을 따라이, 뭔가를 할 수있는 스크립트를 사용하십시오 :

SELECT 'GRANT ALL ON '||table_name||' TO BOB;' 
FROM ALL_TABLES 
WHERE OWNER = 'ALICE'; 

그리고 다른 DB 객체에 대한 유사한

을.

EXECUTE IMMEDIATE를 통해 각 GRANT 문을 모두 호출하는 권한 부여를 필요로하는 패키지를 각 스키마에 넣을 수 있습니다.

PROCEDURE GRANT_TABLES 
    IS 
    BEGIN 

     FOR tab IN (SELECT table_name 
        FROM all_tables 
        WHERE owner = this_user) LOOP 
     EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON '||tab.table_name||' TO other_user'; 
     END LOOP; 
    END; 
7

고려해야 할 사항이 많이 있습니다. 액세스 권한을 말할 때 테이블에 다른 사용자 이름을 접두사로 사용 하시겠습니까? 공용 동의어를 사용하면 원래 소유자를 숨길 수 있습니다 (문제가있는 경우). 그리고 나서 동의어에 privs를 부여합니다.

가능한 한 최선을 다해 계획을 세우고 싶습니다. 나중에 Frank가 Alice의 스키마에도 액세스 할 수있게 하시겠습니까? N 개의 테이블에 대해 특권을 부여하지 않으려 고합니다. 데이터베이스 역할을 사용하는 것이 더 나은 솔루션입니다. 선택 항목에 "ALICE_TABLES"역할을 부여하고 다른 사용자가 액세스해야하는 경우 해당 역할에 권한을 부여하십시오. 이렇게하면 DB 내부에서 부여하는 보조금을 구성하는 데 도움이됩니다.

6

당신이 다른 소유자가있는 경우 또 다른 해결책 :

BEGIN 

    FOR x IN (SELECT owner||'.'||table_name ownertab 
      FROM all_tables 
      WHERE owner IN ('A', 'B', 'C', 'D')) 
    LOOP 
    EXECUTE IMMEDIATE 'GRANT SELECT ON '||x.ownertab||' TO other_user'; 
    END LOOP; 
END;