특정 사용자가 소유한 모든 테이블에 선택 권한 부여

특정 사용자가 소유한 모든 테이블에 대한 선택 권한을 다른 사용자에게 부여해야 합니다. 다음과 같은 명령 한 줄로 이 작업을 수행할 수 있나요?

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; 
해설 (2)

테이블 + 뷰 + 오류 보고

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)

예, 가능합니다. 이 명령을 실행하세요:

'thoko'라는 사용자가 있다고 가정해 보겠습니다.

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

참고: 오라클 데이터베이스에서 작동

해설 (1)

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;
해설 (0)