Bonne année 2017 à tous les DBA, développeurs et forumeurs du site!

Sur le site d'Oracle j'ai lu pour SYSOPER la chose suivante : "This privilege allows a user to perform basic operational tasks, but without the ability to look at user data."
https://docs.oracle.com/cd/B28359_01...htm#ADMIN11047
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
System Privilege	Operations Authorized
SYSDBA	•	Perform STARTUP and SHUTDOWN operations
•	ALTER DATABASE: open, mount, back up, or change character set
•	CREATE DATABASE
•	DROP DATABASE
•	CREATE SPFILE
•	ALTER DATABASE ARCHIVELOG
•	ALTER DATABASE RECOVER
•	Includes the RESTRICTED SESSION privilege
Effectively, this system privilege allows a user to connect as user SYS.

SYSOPER	•	Perform STARTUP and SHUTDOWN operations
•	CREATE SPFILE
•	ALTER DATABASE OPEN/MOUNT/BACKUP
•	ALTER DATABASE ARCHIVELOG
•	ALTER DATABASE RECOVER (Complete recovery only. Any form of incomplete recovery, such as UNTIL TIME|CHANGE|CANCEL|CONTROLFILE requires connecting as SYSDBA.)
•	Includes the RESTRICTED SESSION privilege
This privilege allows a user to perform basic operational tasks, but without the ability to look at user data.
Il est bien marqué que SYSOPER ne permet pas d'accéder aux données utilisateurs, donc qu'aux tables et vues du dictionnaire de données?
J'ai voulu valider cela avec les tests suivants car je ne connaissais pas cette restriction sur SYSOPER.

Le user HR01 a une table V_TEST01 et un synonyme public dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SQL> CONNECT HR01
Enter password:
Connected.
 
SQL> DESC V_TEST01
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 LIB                                                VARCHAR2(50 CHAR)
 
SQL> SELECT COUNT(*) FROM V_TEST01;
  COUNT(*)
----------
         1
 
	SQL> SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME FROM DBA_SYNONYMS 	WHERE TABLE_NAME LIKE 'V%01%';
	OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME
	------------------------------ ------------------------------ ------------------------------ ------------------------------
	PUBLIC                         V_TEST01                       HR01                           V_TEST01

On se connecte comme un autre user, HR, pour voir si le synonyme est OK et si on a les droits de faire un SELECT sur V_TEST01.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> CONNECT HR
Enter password:
Connected.
 
SQL> SELECT COUNT(*) FROM HR01.V_TEST01;
  COUNT(*)
----------
         1
 
SQL> SELECT COUNT(*) FROM  V_TEST01;
  COUNT(*)
----------
         1

On se connecte AS SYSDBA pour voir si le synonyme public fonctionne aussi pour ce privilège système.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SQL> CONNECT HR / AS SYSDBA
Enter password:
Connected.
 
SQL> SHOW USER
USER is "SYS"
 
SQL> SELECT COUNT(*) FROM  V_TEST01;
  COUNT(*)
----------
         1

Même test mais avec AS SYSOPER : le SELECT est KO --> est-ce que ça prouve que SYSOPER ne peux pas accéder aux tables autres que celles du dictionnaire de données, celles pour qui le owner est SYS?
Ce n'est pas une histoire de droits avec GRANT car je n'ai pas donné de droits à SYS sur cette table et ce synonyme public.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
SQL> CONNECT HR / AS SYSOPER
Enter password:
Connected.
 
SQL> SELECT COUNT(*) FROM  V_TEST01;
select count(*) from  v_test01
                      *
ERROR at line 1:
ORA-00942: table or view does not exist

BIZARRE : même sur les tables de SYS, le SELECT est KO! Là, c'est un pb de droits sur le dictionnaire de données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
SQL> CONNECT HR / AS SYSOPER
Enter password:
Connected.
 
SQL> SHOW USER
USER is "PUBLIC"
 
SQL> SELECT COUNT(*) FROM DBA_TABLES;
select count(*) from dba_tables
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

Visiblement, PUBLIC n'a le droit par défaut defaire des SELECT que sur les tables de son schéma, comme un user normal.
C'est bizarre car pour accéder au schéma PUBLIC il faut se connecter avec AS SYSOPER qui est un privilège système puissant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
SQL> SELECT COUNT(*) FROM CAT;
  COUNT(*)
----------
      3978
 
SQL> SELECT COUNT(*) FROM USER_TABLES;
  COUNT(*)
----------
         0

Et si on donne à PUBLIC le droit de faire des SELECT sur tout le dictionnaire de données.
ATTENTION : écrire PUBLIC sans guillemets. Et là ça marche pour les tables SYS!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> CONNECT / AS SYSDBA
	Connected.
 
	SQL> GRANT SELECT ANY DICTIONARY TO PUBLIC;
	Grant succeeded.
 
	SQL> CONNECT HR/HR AS SYSOPER
	Connected.
 
	SQL> SHOW USER
	USER is "PUBLIC"
 
	SQL> SELECT COUNT(*) FROM DBA_TABLES;
	  COUNT(*)
	----------
	      1686

En revanche PUBLIC ne peux toujours pas accéder aux données applicatives.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SQL> SELECT COUNT(*) FROM V_TEST01;
SELECT COUNT(*) FROM V_TEST01
                     *
ERROR at line 1:
ORA-00942: table or view does not exist
 
SQL> SELECT COUNT(*) FROM HR01.V_TEST01;
SELECT COUNT(*) FROM HR01.V_TEST01
                          *
ERROR at line 1:
ORA-00942: table or view does not exist
Est-ce que vous pouvez me dire si je me suis trompé quelque part dans mes tests ou bien si j'ai bien prouvé que SYSOPER ne peut pas accéder aux données applicatives?
Par avance merci!