2010-08-19 1 views
2

Si j'ai une table et une politique définie dessus, dois-je redéfinir la politique si je lâche et recréer la table ou la modifier, à condition que l'altération ou la recréation de la table ne modifie pas les éléments que la fonction doit voir?Est-ce que la modification ou la recréation d'une table dans Oracle affecte les politiques définies?

+0

Oui, je crois que l'abandon d'une table interrompt toutes les politiques qui y sont liées. Cependant, en ce qui concerne la modification, je ne suis pas sûr. Pourriez-vous être plus précis sur la politique, le schéma de la table et ce que vous aimeriez changer? – XstreamINsanity

+0

Certains de mes collègues ont modifié une vue sur une table de sorte qu'une colonne a été définie comme to_date (B) au lieu de B. Maintenant, la politique que j'ai sur cette vue ne se soucie pas de cette colonne. Il dit simplement que "si l'utilisateur est 'NOM D'UTILISATEUR' alors renvoyer le prédicat:" où ID_utilisateur = utilisateur ".Il n'est donc pas affecté par l'alter.La question est si je dois redéfinir la politique même si je ne changerai rien à J'ai aussi élargi ma question de façon à ce que, si un drop-create se produit, je doive recréer la politique, je ne peux pas la tester maintenant (je suis en vacances) et je n'ai pas d'accès, donc je voudrais savoir – Paralife

Répondre

1

"do I need to redefine the policy if I drop and recreate the table"

Oui. Créons une politique.

SQL> exec dbms_rls.add_policy('APC', 'T23', 'DEPTPOL', 'APC', 'security_policies.get_deptno_predicate') 

PL/SQL procedure successfully completed. 

SQL> select count(*) from user_policies; 

    COUNT(*) 
---------- 
     1 

SQL> exec security_policies.set_deptno(20) 

PL/SQL procedure successfully completed. 

SQL> select count(*) from t23; 

    COUNT(*) 
---------- 
     6 

SQL> 

cela fonctionne. Mais si nous laissons tomber et recréer la table (à l'aide d'une sauvegarde j'ai préparé plus tôt) ...

SQL> drop table t23 
    2/

Table dropped. 

SQL> create table t23 as select * from t23a 
    2/

Table created. 

SQL> select count(*) from t23; 

    COUNT(*) 
---------- 
     11 

SQL> exec security_policies.set_deptno(20) 

PL/SQL procedure successfully completed. 

SQL> select count(*) from t23; 

    COUNT(*) 
---------- 
     11 

SQL> SQL> select count(*) from user_policies; 

    COUNT(*) 
---------- 
     0 

SQL> 

"So the question is if I must redefine the policy even if I will not change anything in the definition."

Non Fournir le changement ne remet pas en cause le prédicat généré modifier une table ne baisse pas la règle:

SQL> exec dbms_rls.add_policy('APC', 'T23', 'DEPTPOL', 'APC', 'security_policies.get_deptno_predicate') 

PL/SQL procedure successfully completed. 

SQL> alter table t23 modify deptno number(3,0) 
    2 
SQL> desc t23 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
NAME            VARCHAR2(12 CHAR) 
ID             NUMBER 
AGE            NUMBER(4) 
DEPTNO            NUMBER(2) 

SQL> alter table t23 modify deptno number(3,0) 
    2/

Table altered. 

SQL> exec security_policies.set_deptno(20) 

PL/SQL procedure successfully completed. 

SQL> select count(*) from t23; 

    COUNT(*) 
---------- 
     6 

SQL> 

Notez que la modification a modifié la colonne qui est testée par le prédicat et la stratégie reste en vigueur.


"does a 'CREATE OR REPLACE VIEW' statement drops and recreates it or does it alter it?"

Essayons:

SQL> create view v23 as select * from t23; 

View created. 

SQL> exec dbms_rls.add_policy('APC', 'V23', 'DEPTPOLV', 'APC', 'security_policies.get_deptno_predicate') 

PL/SQL procedure successfully completed. 

SQL> exec security_policies.set_deptno(10) 

PL/SQL procedure successfully completed. 

SQL> select count(*) from v23; 

    COUNT(*) 
---------- 
     5 

SQL> create or replace view v23 as select name, age from t23; 

View created. 

SQL> select count(*) from v23; 
select count(*) from v23 
        * 
ERROR at line 1: 
ORA-28113: policy predicate has error 


SQL> 

Ok, donc c'est une erreur, car la nouvelle projection de la vue ne comprend pas la colonne dans le prédicat. Mais il suggère que la politique est toujours en place. Donc, corrigeons cette erreur:

SQL> create or replace view v23 as select name, age, deptno from t23; 

View created. 

SQL> select count(*) from v23; 

    COUNT(*) 
---------- 
     5 

SQL> 
+0

merci beaucoup Un dernier détail: Si une vue existe, est-ce que l'instruction 'CREATE OR REPLACE VIEW' est perdue et est-elle modifiée? Si c'est la première, alors je dois redéfinir la politique, si c'est la deuxième puis je suppose que la politique est toujours là ... je suis correct? (La politique est définie sur une vue et il était l'opinion qu'ils ont changé à travers le sty CREATE OU REPLACE) – Paralife

+0

Merci. Si je pouvais je vous upvote un 1000 fois juste pour la façon dont vous avez répondu BTW comment faites-vous cela? Je mea Comment trouvez-vous la volonté de passer du temps à expliquer quand vous pourriez consacrer ce temps à en découvrir encore plus? Je me trouve très désireux d'explorer et de créer mais jamais d'expliquer, sauf quand je l'explique comme un moyen d'affiner mes connaissances ... C'est très mauvais mais je trouve très difficile de se débarrasser de cette habitude. Ce n'est pas de l'égoïsme, c'est juste que chaque fois qu'il n'y a rien de nouveau sur la table, je ne peux pas aider mais tergiverser ... – Paralife

+0

Personnellement, je pense qu'expliquer quelque chose à quelqu'un d'autre est un bon moyen de renforcer son propre apprentissage. Deuxièmement, en utilisant un exemple réel (comme APC) est un bon moyen de vérifier que vos propres hypothèses sont bonnes. Et comme Tom Kyte nous le rappelle continuellement, nos hypothèses sur Oracle 9 peuvent être fausses sur 10,11, etc - rien ne vaut la vérification plutôt que la confiance. – JulesLt

Questions connexes