2008-10-09 17 views
36

Muszę udzielić uprawnienia wyboru dla wszystkich tabel posiadanych przez określonego użytkownika innemu użytkownikowi. Mogę to zrobić za pomocą jednego polecenia wzdłuż linii:Grant Wybierz na wszystkich tabelach należących do określonego użytkownika

Grant Select on OwningUser.* to ReceivingUser 

Albo muszę wygenerować SQL dla każdej tabeli z czymś wzdłuż linii:

Select 'GRANT SELECT ON OwningUser.'||Table_Name||'TO ReceivingUser' 
From All_Tables Where Owner='OWNINGUSER' 

Odpowiedz

50

dobrze, to nie jest pojedynczy rachunek, ale jest tak blisko jak można dostać się z oracle:

BEGIN 
    FOR R IN (SELECT owner, table_name FROM all_tables WHERE owner='TheOwner') LOOP 
     EXECUTE IMMEDIATE 'grant select on '||R.owner||'.'||R.table_name||' to TheUser'; 
    END LOOP; 
END; 
+2

Również "dla v w (selec t OWNER, VIEW_NAME z ALL_VIEWS, gdzie OWNER = 'XXX'), pętla' – gavenkoa

-3

tak, jego możliwe, uruchom polecenie:

powiedzmy masz użytkownik nazywa thoko

grant select any table, insert any table, delete any table, update any table to thoko; 

uwaga: działa na bazie danych Oracle

+1

Spowoduje to przyznanie go na wszystkich schematach i będzie wymagać uprawnień systemowych w celu nadania tego – Petr

1

stoły + ciami + błąd raportowania

SET SERVEROUT ON 
DECLARE 
    o_type VARCHAR2(60) := ''; 
    o_name VARCHAR2(60) := ''; 
    o_owner VARCHAR2(60) := ''; 
    l_error_message VARCHAR2(500) := ''; 
BEGIN 
    FOR R IN (SELECT owner, object_type, object_name 
      FROM all_objects 
      WHERE owner='SCHEMANAME' 
      AND object_type IN ('TABLE','VIEW') 
      ORDER BY 1,2,3) LOOP 
    BEGIN 
    o_type := r.object_type; 
    o_owner := r.owner; 
    o_name := r.object_name; 
    DBMS_OUTPUT.PUT_LINE(o_type||' '||o_owner||'.'||o_name); 
    EXECUTE IMMEDIATE 'grant select on '||o_owner||'.'||o_name||' to USERNAME'; 
    EXCEPTION 
     WHEN OTHERS THEN 
     l_error_message := sqlerrm; 
     DBMS_OUTPUT.PUT_LINE('Error with '||o_type||' '||o_owner||'.'||o_name||': '|| l_error_message); 
     CONTINUE; 
    END; 
    END LOOP; 
END; 
/
0

Od http://psoug.org/reference/roles.html utworzyć procedurę na bazie danych dla użytkownika Aby to zrobić:

CREATE OR REPLACE PROCEDURE GRANT_SELECT(to_user in varchar2) AS 

    CURSOR ut_cur IS SELECT table_name FROM user_tables; 

    RetVal NUMBER; 
    sCursor INT; 
    sqlstr VARCHAR2(250); 

BEGIN 
    FOR ut_rec IN ut_cur 
    LOOP 
     sqlstr := 'GRANT SELECT ON '|| ut_rec.table_name || ' TO ' || to_user; 
     sCursor := dbms_sql.open_cursor; 
     dbms_sql.parse(sCursor,sqlstr, dbms_sql.native); 
     RetVal := dbms_sql.execute(sCursor); 
     dbms_sql.close_cursor(sCursor); 

    END LOOP; 
END grant_select; 
Powiązane problemy