it-swarm.com.de

Grant Select für alle Tabellen, die sich im Besitz eines bestimmten Benutzers befinden

Ich muss einem anderen Benutzer die Auswahlberechtigung für alle Tabellen erteilen, die einem bestimmten Benutzer gehören. Kann ich dies mit einem einzigen Befehl wie folgt tun:

Grant Select on OwningUser.* to ReceivingUser

Oder muss ich die SQL für jede Tabelle mit etwas in der Richtung von generieren:

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

Nun, es ist keine einzige Aussage, aber es ist so nahe wie Sie es mit Oracle können:

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; 
52
DCookie

tabellen + Ansichten + Fehlerberichterstattung

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;
/
1
dcvetkov

ja, es ist möglich, führe diesen Befehl aus:

nehmen wir an, Sie haben einen Benutzer namens thoko

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

hinweis: Auf Oracle-Datenbank gearbeitet

1
user2729366

Erstellen Sie unter http://psoug.org/reference/roles.html eine Prozedur in Ihrer Datenbank, in der Ihr Benutzer dies tun kann:

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
J. Chomel