7
votes

Subventions régénérées pour les rôles entre les schémas

Semblable à Cette question , j'aimerais savoir comment générer toutes les déclarations publiées à tous les rôles dans un ensemble de schémas et une liste de rôles dont les noms se terminent par "proxy". Je souhaite recréer des déclarations telles que: xxx

Le but est d'aider à migrer à partir d'une base de données de développement à une base de données de test (Oracle 11g). Il existe des outils qui tentent de le faire automatiquement, mais échouent souvent.

Des idées?


1 commentaires

Je suppose que vous devez le faire la dure. Boucle via le "all_tab_privs" et générer ce script. Une question intéressante cependant. J'aimerais savoir si c'est possible.


4 Réponses :


1
votes

Vous pouvez le faire avec un code PL / SQL:

TYPE obj_name_type is TABLE OF ALL_OBJECTS%OBJECT_NAME INDEX BY BINARY_INTEGER;
object_names obj_name_type;
i INTEGER;
BEGIN
   SELECT object_name BULK COLLECT INTO object_names FROM ALL_OBJECTS WHERE OWNER = 'whatever' AND object_type = 'PROCEDURE';
   FOR i IN 1 .. object_names.last LOOP
         EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' object_names(i) ' TO ' role_name
   END LOOP;
END;


4 commentaires

Cela permettrait d'accorder des droits excactuels à toutes les procédures de votre propriétaire. Si j'ai bien compris la question, il s'agit d'obtenir des subventions réelles et de fournir un script pour les recréer sur un schéma différent.


Je montrais juste l'idée générale. Vous pouvez ajuster la requête SELECT pour obtenir la bonne liste.


Pourquoi ne pas utiliser pl / sql? Cela semble être un bon outil à cet effet.


Pl / SQL ajoute une couche supplémentaire de complexité qui n'est pas nécessaire - cela signifie également qu'il faut plus de temps pour utiliser dans le développeur PL / SQL.



0
votes

Cela répond à nos besoins:

SELECT
  'GRANT ' || p.privilege || ' ON ' || p.table_name || ' TO ' ||
  p.grantee || ';' AS generated_grant
FROM
  dba_tab_privs p
WHERE
  p.grantor IN ( 'SCHEMA_NAME_01', 'SCHEMA_NAME_02' ) AND
  p.grantee IN (
    SELECT DISTINCT
      granted_role
    FROM
      dba_role_privs
    WHERE
      grantee LIKE '%PROXY' AND
      granted_role NOT IN ('CONNECT','AQ_ADMINISTRATOR_ROLE','RESOURCE')
  ) AND
  p.table_name NOT LIKE 'BIN%' AND
  p.table_name NOT LIKE '%$%'
ORDER BY
  p.table_name, p.grantee, p.privilege;


2 commentaires

Hélas cela ne fonctionne pas. Il n'inclut pas le propriétaire de l'objet dans le script, qui compte lorsque nous manipulons plusieurs schémas. En outre, GRANDER est le compte qui a émis l'original Grant ... déclaration non au schéma de possession.


Assez juste. Je voulais juste signaler des domaines potentiels qui pourraient causer des problèmes pour les futurs demandeurs qui viennent à ce sujet à travers un résultat de perquisition.



10
votes

Ce script génère une liste de tous les privilèges de table accordés aux rôles ...

select dbms_metadata.get_granted_ddl('OBJECT_GRANT', 'A') from dual
/


0 commentaires

0
votes

Je voulais résoudre un problème beaucoup comme celui-ci. La seule différence est que je voulais un outil plus générique, ainsi que le DBMS agnostique. Je voulais pouvoir appliquer l'outil dans les environnements de production et certaines des bases de données cible n'étaient pas oracle.

Qu'est-ce que j'ai proposé était une fonction PowerShell qui effectue une substitution de paramètres et génère un script répétitif contenant une séquence de déclarations de subventions. La sortie ressemble à p> xxx pré>

Il existe deux entrées de mon outil, un fichier de modèle et un fichier CSV. Les regards de fichier de modèle comme celui-ci: p>

Expand-csv demo.csv demo.tem > demo.sql


0 commentaires