mercredi 19 novembre 2014

Mode Archivelog

Voici une question pour vous aider à étudier pour l'examen OCA. Quelle commande peut-on utiliser pour savoir si une base de données soit en mode ARCHIVELOG?

A. archivelog list
B. show archive mode
C. archive log list
D. list archivelog

J'ai testé les choix  sur Oracle 12 de la manière suivante: 

SQL> conn / as sysdba
Connecté.
SQL> archivelog list
SP2-0734: commande inconnue au début de "archivelog..." - le reste de la ligne est ignoré.
SQL> show archive mode
SP2-0158: option SHOW inconnue "archive"
SP2-0158: option SHOW inconnue "mode"
SQL> archive log list
mode Database log              mode No Archive
Archivage automatique             Désactivé
Destination de l'archive             USE_DB_RECOVERY_FILE_DEST
Séquence de journal en ligne la plus ancienne     157
Séquence de journal courante            159
SQL> list archivelog
SP2-0223: Pas de lignes dans la mémoire tampon SQL.
SQL> 

Donc, la réponse correcte est C.

Pour quelque raison que je ne comprends pas, le résultat est meilleur rangé en anglais: 

SQL> conn / as sysdba
Connecté.
SQL> alter session set nls_language = 'ENGLISH';
 
Session altered.
 
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     157
Current log sequence           159
SQL>

mardi 4 novembre 2014

Connexion Comme SYSOPER

Voici une question pour vous aider à étudier pour l'examen OCA. Je me suis servi de la commande suivante pour me connecter à une base de données sur Oracle 12.1:

sqlplus fred/bloggs as sysoper

Ensuite j'ai tapé show user pour connaître le nom de l'utilisateur que j'employais. Quelle réponse Oracle m'a-t-il donnée?

A. SYSTEM
B. FRED
C. SYS
D. PUBLIC
E. SYSOPER

Voici ce que j'ai vu:

C:\Users\Andrew>sqlplus fred/bloggs as sysoper
 
SQL*Plus: Release 12.1.0.1.0 Production on Mar. Nov. 4 18:01:24 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Connecté à :
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL> show user
USER est "PUBLIC"
SQL> exit
Déconnecté de Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
C:\Users\Andrew>

Donc, la réponse correcte est D.

samedi 1 novembre 2014

ORA-01951, ORA-01952 et ORA-01045

J'ai vu une question étrange sur un forum et j'ai décidé de la recréer dans une base de données sur Oracle version 12.1. D'abord j'ai créé un utilisateur:

SQL> conn / as sysdba
Connecté.
SQL> create user a identified by b
  2  /
 
Utilisateur créé.

SQL>

Ensuite j'ai découvert que l'utilisateur pouvait faire un login, apparemment, sans le privilège CREATE SESSION:

SQL> conn a/b
Connecté.
SQL>

Après avoir fait son login, l'utilisateur avait un rôle et deux privilèges:

SQL> col role format a30
SQL> select * from session_roles
  2  /
 
ROLE
------------------------------
CONNECT
 
SQL> col privilege format a30
SQL> select * from session_privs
  2  /
 
PRIVILEGE
------------------------------
SET CONTAINER
CREATE SESSION

SQL>

Cependant, quand j'ai essayé de révoquer le rôle, j'ai vu une erreur ORA-01951 et quand j'ai essayé de révoquer le privilège, j'au vu une erreur ORA-01952:

SQL> conn / as sysdba
Connecté.
SQL> revoke connect from a
  2  /
revoke connect from a
*
ERREUR à la ligne 1 :
ORA-01951: ROLE 'CONNECT' non accordé à 'A'
 
SQL> revoke create session from a
  2  /
revoke create session from a
*
ERREUR à la ligne 1 :
ORA-01952: privilèges du système non accordés à 'A'

SQL>

J'ai noté qu'on avait accordé CONNECT à PUBLIC:

SQL> col granted_role format a30
SQL> select granted_role
  2  from dba_role_privs
  3  where grantee = 'PUBLIC'
  4  /
 
GRANTED_ROLE
------------------------------
CONNECT

SQL>

Alors je l'ai révoqué:

SQL> revoke connect from public
  2  /
 
Suppression de privilèges (REVOKE) acceptée.

SQL>

... et le problème a disparu:

SQL> conn a/b
ERROR:
ORA-01045: l'utilisateur A n'a pas le privilège CREATE
SESSION ; connexion refusée
 
Avertissement : vous n'êtes plus connecté à ORACLE.
SQL>

vendredi 6 juin 2014

Les Dangers de CREATE ANY PROCEDURE et EXECUTE ANY PROCEDURE

J’ai testé cet exemple sur Oracle 12.1. Il ne faut pas donner CREATE ANY PROCEDURE et EXECUTE ANY PROCEDURE au même utilisateur. Pourquoi pas? Alors, j’ai donné ces deux privilèges ou droits à Andrew:
 
SQL> conn / as sysdba
Connected.
SQL> grant create any procedure,
  2        execute any procedure,
  3        create session
  4  to andrew identified by reid
  5  /
 
Autorisation de privilèges (GRANT) acceptée.
 
SQL>
 
Le droit CREATE ANY PROCEDURE lui a permi de créer une procédure dans SYSTEM:
 
SQL> conn andrew/reid
Connected.
SQL> create or replace procedure
  2  system.run_sql(sqlstr in varchar2) is
  3  begin
  4  execute immediate sqlstr;
  5  end;
  6  /
 
Procédure créée.
 
SQL>
 
Le droit EXECUTE ANY PROCEDURE lui a permi de lancer cette procédure:
 
SQL> exec system.run_sql('grant dba to andrew');
 
Procédure PL/SQL terminée avec succès.
 
SQL>
 
… et maintenant il a le rôle DBA et il peut faire ce qu’il veut dans ma base de données :
 
SQL> select granted_role from user_role_privs
  2  /
 
GRANTED_ROLE
-------------------------------------------------------
DBA
 
SQL>

jeudi 17 avril 2014

Un Exemple Simple avec REPLACE

Si vous voulez mettre à jour une colonne et remplacer un caractère (ou une série de caractères) par un autre caractère (ou une autre série de caractères), vous pouvez le faire avec la fonction REPLACE. Quand on l'utilise, il faut fournir le nom de la colonne, la vielle et la nouvelle série de caractères. Voici un exemple que j’ai créé pour une collègue qui m’aide avec mon français. Je l’ai testé sur Oracle 12.1:
 
SQL> create table directory_name
  2  (location varchar2(30))
  3  /
 
Table créée.
 
SQL> insert into directory_name
  2  values('/batch/prod/dir1')
  3  /
 
1 ligne créée.
 
SQL> insert into directory_name
  2  values('/batch/prod/dir2')
  3  /
 
1 ligne créée.
 
SQL> select location from directory_name
  2  /
 
LOCATION
------------------------------
/batch/prod/dir1
/batch/prod/dir2
 
SQL> update directory_name
  2  set location = replace(location,'prod','test')
  3  /
 
2 lignes mises à jour.
 
SQL> select location from directory_name
  2  /
 
LOCATION
------------------------------
/batch/test/dir1
/batch/test/dir2
 
SQL>

dimanche 16 mars 2014

Le Problème avec REVOKE

J'ai testé cet exemple sur Oracle 11.2. Il vous montre pourquoi il faut faire attention quand vous utilisez la commande REVOKE. Quand on donne le rôle DBA à un utilisateur, Oracle lui donne le privilège système UNLIMITED TABLESPACE en même temps:

SQL> create user andrew identified by reid
  2  /

Utilisateur créé.

SQL> grant dba to andrew
  2  /

Autorisation de privilèges (GRANT) acceptée.

SQL> select granted_role from dba_role_privs
  2  where grantee = 'ANDREW'
  3  /

GRANTED_ROLE
------------------------------
DBA

SQL> select privilege from dba_sys_privs
  2  where grantee = 'ANDREW'
  3  /

PRIVILEGE
----------------------------------------
UNLIMITED TABLESPACE


SQL>

Quand on révoque le rôle DBA d'un utilisateur, Oracle révoque le privilège système UNLIMITED TABLESPACE aussi:

SQL> revoke dba from andrew
  2  /

Suppression de privilèges (REVOKE) acceptée.

SQL> select granted_role from dba_role_privs
  2  where grantee = 'ANDREW'
  3  /

aucune ligne sélectionnée

SQL> select privilege from dba_sys_privs
  2  where grantee = 'ANDREW'
  3  /

aucune ligne sélectionnée


SQL>

Alors, qu'est-ce qui se passe si on donne le privilège système UNLIMITED TABLESPACE à un utilisateur explicitement?

SQL> grant unlimited tablespace to andrew
  2  /

Autorisation de privilèges (GRANT) acceptée.

SQL> select privilege from dba_sys_privs
  2  where grantee = 'ANDREW'
  3  /

PRIVILEGE
----------------------------------------
UNLIMITED TABLESPACE


SQL>

Puis on lui donne le rôle DBA:

SQL> grant dba to andrew
  2  /

Autorisation de privilèges (GRANT) acceptée.

SQL> select granted_role from dba_role_privs
  2  where grantee = 'ANDREW'
  3  /

GRANTED_ROLE
------------------------------
DBA

SQL> select privilege from dba_sys_privs
  2  where grantee = 'ANDREW'
  3  /

PRIVILEGE
----------------------------------------
UNLIMITED TABLESPACE


SQL>

... et ensuite on le révoque:

SQL> revoke dba from andrew
  2  /

Suppression de privilèges (REVOKE) acceptée.

SQL> select granted_role from dba_role_privs
  2  where grantee = 'ANDREW'
  3  /

aucune ligne sélectionnée


SQL>

Oracle révoque le privilège système UNLIMITED TABLESPACE aussi. J'imagine que vous n'aviez pas l'intention de faire cela!

SQL> select privilege from dba_sys_privs
  2  where grantee = 'ANDREW'
  3  /

aucune ligne sélectionnée

SQL>