Мне нужно предоставить разрешение на выбор для всех таблиц, принадлежащих определенному пользователю, другому пользователю. Могу ли я сделать это с помощью одной команды в соответствии с:
Grant Select on OwningUser.* to ReceivingUser
Или мне нужно сгенерировать sql для каждой таблицы с чем-то вроде:
Select 'GRANT SELECT ON OwningUser.'||Table_Name||'TO ReceivingUser' From All_Tables Where Owner='OWNINGUSER'
Ну, это не одно утверждение, но оно настолько близко, насколько вы можете получить с оракулом:
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;
таблицы + просмотры + отчеты об ошибках
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; /
да, возможно, запустите эту команду:
Допустим, у вас есть пользователь с именем thoko
thoko
grant select any table, insert any table, delete any table, update any table to thoko;
примечание: работал с базой данных Oracle
С http://psoug.org/reference/roles.html, создайте процедуру в вашей базе данных для вашего пользователя, чтобы сделать это:
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;