Berechtigungen auf anderes Schema vergeben

Manchmal steht die Aufgabe im Raum, daß man mit einem Oracle User auf die Daten eines anderen Users zugreifen möchte. Bei ein paar Tabellen ist die Rechtevergabe relativ überschaubar. Soll eine Berechtigung auf alle Tabellen bzw. Objekte vergeben werden, hört der Spaß mit einer händischen Rechtevergabe meistens auf. Leider gibt es bei Oracle nämlich kein Statement der Form GRANT SELECT ON SCHEMA. Was bleibt einem übrig? Was man nicht selber machen möchte, muß man skripten.

Nachfolgendes Skript vergibt an den Berechtigungsempfänger die gebräuchlichsten Rechte, damit man mit den Daten in einem anderen Schema arbeiten kann.

DECLARE 
  V_OWNER VARCHAR2(30) := 'USER_THAT_OWNS_THE_SCHEMA';
  V_GRANTEE VARCHAR2(30) := 'USER_THAT_WILL_GET_THE_GRANTS';
BEGIN
  FOR Rec IN (SELECT object_name, object_type FROM all_objects WHERE owner=V_OWNER AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE','SEQUENCE')) LOOP
    IF Rec.object_type IN ('TABLE','VIEW') THEN
      EXECUTE IMMEDIATE 'GRANT SELECT, UPDATE, INSERT, DELETE ON ' || V_OWNER || '.' || Rec.object_name || ' TO ' || V_GRANTEE;
    ELSIF Rec.object_type IN ('SEQUENCE') THEN
      EXECUTE IMMEDIATE 'GRANT SELECT ON ' || V_OWNER || '.' || Rec.object_name || ' TO ' || V_GRANTEE;      
    ELSIF Rec.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN
      EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || V_OWNER || '.' || Rec.object_name || ' TO ' || V_GRANTEE;
    END IF;
  END LOOP;
END;
/