<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Cours DBA</title>
	<atom:link href="http://coursdba.estsurinternet.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://coursdba.estsurinternet.com</link>
	<description>par Didier Deleglise,  (c)2011 Tous droits réservés</description>
	<pubDate>Wed, 30 Nov 2011 11:47:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>B.4 - Contraintes d&#8217;intégrité</title>
		<link>http://coursdba.estsurinternet.com/droits-dacces/contraintes-dintegrite/</link>
		<comments>http://coursdba.estsurinternet.com/droits-dacces/contraintes-dintegrite/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 16:03:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[B -Sécurité]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=770</guid>
		<description><![CDATA[<p>Les contraintes sont des règles de gestion, qui doivent (normalement) être vérifiées lors des mises à jour (INSERT, UPDATE, DELETE).
Ces contrôles sont centralisés dans la base, au niveau de la structure de la table elle même et non pas déportées sur l’application cliente.
Une mise à jour qui ne satisfait pas une contrainte, déclenche une erreur [...]]]></description>
			<content:encoded><![CDATA[<p>Les contraintes sont des règles de gestion, qui doivent (normalement) être vérifiées lors des mises à jour (INSERT, UPDATE, DELETE).<br />
Ces contrôles sont centralisés dans la base, au niveau de la structure de la table elle même et non pas déportées sur l’application cliente.<br />
Une mise à jour qui ne satisfait pas une contrainte, déclenche une erreur d’exécution :’…CONSTRAINT VIOLATED…’<br />
Dans certains cas les contraintes peuvent être momentanément invalidées (DISABLEd ou DEFERRED).</p>
<p>Il y a plusieurs types de contraintes :</p>
<p>- NULL : valeur indéfinie (??)<br />
- NOT NULL : valeur obligatoire (non indéfinie)<br />
- DEFAULT : une valeur par defaut si non renseignée<br />
- UNIQUE : !<br />
- PRIMARY KEY : clé primaire (identifiant de la table, obligatoire ET unique)<br />
- FOREIGN KEY : clé étrangère ‘colonne qui référence la clé primaire d’une autre table)<br />
- CHECK : doit vérifier une condition</p>
<p>On peut créer des contraintes directement avec l’instruction ‘CREATE TABLE’ ou en ajouter / modifier / supprimer, respectivement avec les instructions ‘ALTER TABLE ADD | MODIFY |DROP CONSTRAINT …’</p>
<p>exemples de contraintes</p>
<blockquote><p>
– exemple de table avec des colonnes …<br />
– et des contrainte NOT NULL, UNIQUE, PRIMARY KEY et CHECK</p>
<p>SQL&gt; DROP TABLE employe_dd;</p>
<p>SQL&gt; CREATE TABLE employe_dd<br />
( employee_id NUMBER(6) PRIMARY KEY<br />
, last_name VARCHAR2(25) NOT NULL<br />
, salary NUMBER(8,2)<br />
, CONSTRAINT emp_salary_min_dd CHECK (salary &gt; 0)<br />
, email VARCHAR2(25) NOT NULL<br />
, CONSTRAINT emp_email_dd UNIQUE (email)<br />
, commission_pct NUMBER(2,2)<br />
, department_id NUMBER(4)<br />
) ;</p></blockquote>
<p>– exemple de table avec clé primaire et étrangère NOMMEES rajoutées ? posteriori<br />
– ici la contrainte NOT NULL est nommée…</p>
<blockquote><p>SQL&gt; DROP TABLE departement_dd;<br />
SQL&gt; CREATE TABLE departement_dd<br />
( department_id NUMBER(4)<br />
, department_name VARCHAR2(30) CONSTRAINT dept_name_dd_nn NOT NULL<br />
, location_id NUMBER(4)<br />
) ;<br />
SQL&gt; ALTER TABLE departement_dd<br />
ADD ( CONSTRAINT dept_id_dd_pk PRIMARY KEY (department_id));<br />
SQL&gt; ALTER TABLE employe_dd<br />
ADD ( CONSTRAINT emp_dept_dd_fk FOREIGN KEY (department_id)<br />
REFERENCES departement_dd );</p></blockquote>
<p>Note : la contrainte d’intégrité référentielle impose qu’un employé appartienne a un département EXISTANT.<br />
Symétriquement, si l’on veut supprimer un département qui a des employes on viole la contrainte :<br />
SQL&gt; delete from departments where department_id=10;<br />
–&gt; erreur : ORA-02292: violation de contrainte (HR.EMP_DEPT_FK) d’intégrité - enregistrement fils existant</p>
<p>Il existe une clause ‘ON DELETE CASCADE’ qui permet de déclencher une suppression automatique des lignes ‘filles’ si une ligne ‘mère’ est supprimée : supprimer par exemple tous les emplyés associés ? un departement qui vient d’être supprimé…</p>
<blockquote><p>SQL&gt; ALTER TABLE employees<br />
ADD ( CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)<br />
REFERENCES departments ON DELETE CASCADE )<br />
SQL&gt; select count(*) from employees<br />
WHERE department_id=100;<br />
–&gt; 6<br />
SQL&gt; DELETE from departments WHERE department_id=100;<br />
–&gt; 1 row deleted<br />
mais les lignes de ‘employees’ correspondantes ont également été supprimées :<br />
SQL&gt; select count(*) from employees<br />
WHERE department_id=100;<br />
–&gt; 0</p></blockquote>
<h3>Infos dans le référentiel</h3>
<p>SQL&gt; select * from user_constraints</p>
<p>ou + précisément</p>
<p>SQL&gt; select constraint_name, constraint_type, table_name,<br />
search_condition,r_constraint_name, status<br />
from user_constraints<br />
where table_name like ‘%DD’</p>
<p>CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION R_CONST_NAME STATUS<br />
—————– ————— ———- —————- ———— ——<br />
EMP_SALARY_MIN_DD C EMPLOYE_DD salary &gt; 0 - ENABLED<br />
SYS_C004030 C EMPLOYE_DD EMAIL IS NOT NULL - ENABLED<br />
SYS_C004029 C EMPLOYE_DD LAST_NAME IS NOT NULL - ENABLED<br />
DEPT_NAME_DD_NN C DEPARTEMENT_DD D_NAME IS NOT NULL - ENABLED<br />
EMP_DEPT_DD_FK R EMPLOYE_DD - DEPT_ID_DD_PK ENABLED<br />
SYS_C004032 P EMPLOYE_DD - - ENABLED<br />
EMP_EMAIL_DD U EMPLOYE_DD - - ENABLED<br />
DEPT_ID_DD_PK P DEPARTEMENT_DD - - ENABLED</p>
<h3>invalidation de contraintes</h3>
<p>Les clauses ‘DEFERRED’ et ‘DEFERRABLE’ permettent de différer l’application de la contrainte à la fin de la<br />
transaction :</p>
<p>SQL&gt; create table test(n number check ( n in (10, 20) ) deferrable initially deferred );<br />
SQL&gt; alter session set constraint = deferred;<br />
SQL&gt; insert into test values(100);<br />
–&gt; OK<br />
SQL&gt; insert into test values(200);<br />
SQL&gt; commit;<br />
–&gt; erreur sur la transaction<br />
ORA-02091: transaction annulée<br />
ORA-02290: violation de contraintes (HR.SYS_C004039) de vérification</p>
<p>SQL&gt; alter session set constraint = immediate;<br />
SQL&gt; insert into test values (100);<br />
–&gt; erreur sur l’insertion :<br />
ORA-02290: violation de contraintes (HR.SYS_C004039) de vérification</p>
<p>On peut également utiliser les clause ENABLE/DISABLE de ‘ALTER TABLE’<br />
ENABLE VALIDATE : s’applique aux lignes existantes dans la table<br />
ENABLE NOVALIDATE : aux ligne futures<br />
DISABLE : inhibe la contrainte</p>
<p>SQL&gt; CREATE TABLE test (n number , constraint nb_ok check ( n in (10, 20) ));<br />
SQL&gt; insert into test values (100);<br />
– erreur : ORA-02290: violation de contraintes (HR.NB_OK) de vérification<br />
SQL&gt; ALTER TABLE test DISABLE CONSTRAINT nb_ok ;<br />
SQL&gt; insert into testing values(100);<br />
–&gt; 1 ligne insérée (la contrainte était inhibée)</p>
<p>ALTER TABLE test ENABLE NOVALIDATE CONSTRAINT nb_ok;<br />
–&gt; OK : Table Altered…</p>
<p>ALTER TABLE test ENABLE VALIDATE CONSTRAINT nb_ok;<br />
–&gt; erreur : ORA-02293: impossible de valider (HR.NB_OK)<br />
- violation d’une contrainte de contrôle</p>
<p>la clause validate, force le controle de la contraine sur la lignes existantes et la valeur ‘100′ insérée précédemment est non conforme…</p>
<p>Voici un exemple complet de création de mini base avec contraintes, d’après les tables de démo HR officielles d’Oracle :</p>
<blockquote>
<p>Rem<br />
Rem $Header: hr_cre.sql 29-aug-2002.11:44:03 hyeh Exp $<br />
Rem Copyright (c) 2001, 2002, Oracle Corporation. All rights reserved.<br />
Rem</p>
<p>REM ****************************************************<br />
REM Create the REGIONS table to hold region information for locations<br />
REM HR.LOCATIONS table has a foreign key to this table.</p>
<p>Prompt ****** Creating REGIONS table ….</p>
<p>CREATE TABLE regions<br />
( region_id NUMBER<br />
CONSTRAINT region_id_nn NOT NULL<br />
, region_name VARCHAR2(25)<br />
);</p>
<p>CREATE UNIQUE INDEX reg_id_pk<br />
ON regions (region_id);</p>
<p>ALTER TABLE regions<br />
ADD ( CONSTRAINT reg_id_pk<br />
PRIMARY KEY (region_id)<br />
) ;</p>
<p>REM ********************************************************<br />
REM Create the COUNTRIES table to hold country information for customers<br />
REM and company locations.<br />
REM OE.CUSTOMERS table and HR.LOCATIONS have a foreign key to this table.</p>
<p>Prompt ****** Creating COUNTRIES table ….</p>
<p>CREATE TABLE countries<br />
( country_id CHAR(2)<br />
CONSTRAINT country_id_nn NOT NULL<br />
, country_name VARCHAR2(40)<br />
, region_id NUMBER<br />
, CONSTRAINT country_c_id_pk<br />
PRIMARY KEY (country_id)<br />
)<br />
ORGANIZATION INDEX;</p>
<p>ALTER TABLE countries<br />
ADD ( CONSTRAINT countr_reg_fk<br />
FOREIGN KEY (region_id)<br />
REFERENCES regions(region_id)<br />
) ;</p>
<p>REM ********************************************************<br />
REM Create the LOCATIONS table to hold address information for company departments.<br />
REM HR.DEPARTMENTS has a foreign key to this table.</p>
<p>Prompt ****** Creating LOCATIONS table ….</p>
<p>CREATE TABLE locations<br />
( location_id NUMBER(4)<br />
, street_address VARCHAR2(40)<br />
, postal_code VARCHAR2(12)<br />
, city VARCHAR2(30)<br />
CONSTRAINT loc_city_nn NOT NULL<br />
, state_province VARCHAR2(25)<br />
, country_id CHAR(2)<br />
) ;</p>
<p>CREATE UNIQUE INDEX loc_id_pk<br />
ON locations (location_id) ;</p>
<p>ALTER TABLE locations<br />
ADD ( CONSTRAINT loc_id_pk<br />
PRIMARY KEY (location_id)<br />
, CONSTRAINT loc_c_id_fk<br />
FOREIGN KEY (country_id)<br />
REFERENCES countries(country_id)<br />
) ;</p>
<p>Rem Useful for any subsequent addition of rows to locations table<br />
Rem Starts with 3300</p>
<p>CREATE SEQUENCE locations_seq<br />
START WITH 3300<br />
INCREMENT BY 100<br />
MAXVALUE 9900<br />
NOCACHE<br />
NOCYCLE;</p>
<p>REM **************************************************<br />
REM Create the DEPARTMENTS table to hold company department information.<br />
REM HR.EMPLOYEES and HR.JOB_HISTORY have a foreign key to this table.</p>
<p>Prompt ****** Creating DEPARTMENTS table ….</p>
<p>CREATE TABLE departments<br />
( department_id NUMBER(4)<br />
, department_name VARCHAR2(30)<br />
CONSTRAINT dept_name_nn NOT NULL<br />
, manager_id NUMBER(6)<br />
, location_id NUMBER(4)<br />
) ;</p>
<p>CREATE UNIQUE INDEX dept_id_pk<br />
ON departments (department_id) ;</p>
<p>ALTER TABLE departments<br />
ADD ( CONSTRAINT dept_id_pk<br />
PRIMARY KEY (department_id)<br />
, CONSTRAINT dept_loc_fk<br />
FOREIGN KEY (location_id)<br />
REFERENCES locations (location_id)<br />
) ;</p>
<p>Rem Useful for any subsequent addition of rows to departments table<br />
Rem Starts with 280</p>
<p>CREATE SEQUENCE departments_seq<br />
START WITH 280<br />
INCREMENT BY 10<br />
MAXVALUE 9990<br />
NOCACHE<br />
NOCYCLE;</p>
<p>REM *********************************************<br />
REM Create the JOBS table to hold the different names of job roles within the company.<br />
REM HR.EMPLOYEES has a foreign key to this table.</p>
<p>Prompt ****** Creating JOBS table ….</p>
<p>CREATE TABLE jobs<br />
( job_id VARCHAR2(10)<br />
, job_title VARCHAR2(35)<br />
CONSTRAINT job_title_nn NOT NULL<br />
, min_salary NUMBER(6)<br />
, max_salary NUMBER(6)<br />
) ;</p>
<p>CREATE UNIQUE INDEX job_id_pk<br />
ON jobs (job_id) ;</p>
<p>ALTER TABLE jobs<br />
ADD ( CONSTRAINT job_id_pk<br />
PRIMARY KEY(job_id)<br />
) ;</p>
<p>REM ***********************************************<br />
REM Create the EMPLOYEES table to hold the employee personnel<br />
REM information for the company.<br />
REM HR.EMPLOYEES has a self referencing foreign key to this table.</p>
<p>Prompt ****** Creating EMPLOYEES table ….</p>
<p>CREATE TABLE employees<br />
( employee_id NUMBER(6)<br />
, first_name VARCHAR2(20)<br />
, last_name VARCHAR2(25)<br />
CONSTRAINT emp_last_name_nn NOT NULL<br />
, email VARCHAR2(25)<br />
CONSTRAINT emp_email_nn NOT NULL<br />
, phone_number VARCHAR2(20)<br />
, hire_date DATE<br />
CONSTRAINT emp_hire_date_nn NOT NULL<br />
, job_id VARCHAR2(10)<br />
CONSTRAINT emp_job_nn NOT NULL<br />
, salary NUMBER(8,2)<br />
, commission_pct NUMBER(2,2)<br />
, manager_id NUMBER(6)<br />
, department_id NUMBER(4)<br />
, CONSTRAINT emp_salary_min<br />
CHECK (salary &gt; 0)<br />
, CONSTRAINT emp_email_uk<br />
UNIQUE (email)<br />
) ;</p>
<p>CREATE UNIQUE INDEX emp_emp_id_pk<br />
ON employees (employee_id) ;</p>
<p>ALTER TABLE employees<br />
ADD ( CONSTRAINT emp_emp_id_pk<br />
PRIMARY KEY (employee_id)<br />
, CONSTRAINT emp_dept_fk<br />
FOREIGN KEY (department_id)<br />
REFERENCES departments<br />
, CONSTRAINT emp_job_fk<br />
FOREIGN KEY (job_id)<br />
REFERENCES jobs (job_id)<br />
, CONSTRAINT emp_manager_fk<br />
FOREIGN KEY (manager_id)<br />
REFERENCES employees<br />
) ;</p>
<p>ALTER TABLE departments<br />
ADD ( CONSTRAINT dept_mgr_fk<br />
FOREIGN KEY (manager_id)<br />
REFERENCES employees (employee_id)<br />
) ;</p>
<p>Rem Useful for any subsequent addition of rows to employees table<br />
Rem Starts with 207</p>
<p>CREATE SEQUENCE employees_seq<br />
START WITH 207<br />
INCREMENT BY 1<br />
NOCACHE<br />
NOCYCLE;</p>
<p>REM ***********************************************<br />
REM Create the JOB_HISTORY table to hold the history of jobs that<br />
REM employees have held in the past.<br />
REM HR.JOBS, HR_DEPARTMENTS, and HR.EMPLOYEES have a foreign key to this table.</p>
<p>Prompt ****** Creating JOB_HISTORY table ….</p>
<p>CREATE TABLE job_history<br />
( employee_id NUMBER(6)<br />
CONSTRAINT jhist_employee_nn NOT NULL<br />
, start_date DATE<br />
CONSTRAINT jhist_start_date_nn NOT NULL<br />
, end_date DATE<br />
CONSTRAINT jhist_end_date_nn NOT NULL<br />
, job_id VARCHAR2(10)<br />
CONSTRAINT jhist_job_nn NOT NULL<br />
, department_id NUMBER(4)<br />
, CONSTRAINT jhist_date_interval<br />
CHECK (end_date &gt; start_date)<br />
) ;</p>
<p>CREATE UNIQUE INDEX jhist_emp_id_st_date_pk<br />
ON job_history (employee_id, start_date) ;</p>
<p>ALTER TABLE job_history<br />
ADD ( CONSTRAINT jhist_emp_id_st_date_pk<br />
PRIMARY KEY (employee_id, start_date)<br />
, CONSTRAINT jhist_job_fk<br />
FOREIGN KEY (job_id)<br />
REFERENCES jobs<br />
, CONSTRAINT jhist_emp_fk<br />
FOREIGN KEY (employee_id)<br />
REFERENCES employees<br />
, CONSTRAINT jhist_dept_fk<br />
FOREIGN KEY (department_id)<br />
REFERENCES departments<br />
) ;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/droits-dacces/contraintes-dintegrite/feed/</wfw:commentRss>
		</item>
		<item>
		<title>2.4 - DBA s et privilèges</title>
		<link>http://coursdba.estsurinternet.com/dba/24-dba-s-et-privileges/</link>
		<comments>http://coursdba.estsurinternet.com/dba/24-dba-s-et-privileges/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 13:43:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[2 - Administration d'Oracle (DBA)]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=723</guid>
		<description><![CDATA[
DBA et privilèges système
<p>La fonction de DBA, nécessite des privilèges au niveau Système d’exploitation :
- pour l’installation,
- la maintenance,
- la gestion et l’exécution de batchs, de scripts (SQL ou shell),
- les sauvegardes / restauration

Sur Unix / Linux :
Il existe un user Unix nommé ‘oracle’ et un groupe associé nommé ‘dba’.
Tous les fichiers Oracle, appartiennent à [...]]]></description>
			<content:encoded><![CDATA[<div class="post-bodycopy clearfix">
<h4>DBA et privilèges système</h4>
<p>La fonction de DBA, nécessite des privilèges au niveau Système d’exploitation :<br />
- pour l’installation,<br />
- la maintenance,<br />
- la gestion et l’exécution de batchs, de scripts (SQL ou shell),<br />
- les sauvegardes / restauration<br />
<strong><br />
</strong><span class="moduleheading">Sur Unix / Linux :</span><br />
Il existe un user Unix nommé ‘oracle’ et un groupe associé nommé ‘dba’.<br />
Tous les fichiers Oracle, appartiennent à l’utilisateur Oracle.</p>
<p>On peut (doit ?) crééer autant d’utilisateur Unix que de DBAs dans l’entreprise ; dba1, dba2, appartenant au groupe ‘dba’.Ceci permet d’éviter les recouvrements et d’avoir une meilleure tracabilité.<br />
On évitera de travailler connecté en tant qu’utilisateur ‘oracle’ pour éviter toute erreur de manipulation des fichiers Oracle.</p>
<p>Note : les programmes et processus, qui constituent le coeur d’Oracle, s’executent en tant qu’oracle, et ont conséquemment les droits nécessaires pour écrire dans les fichiers de données, journaux, archives, etc.</p>
<p><span class="moduleheading">Le DBA et le super utilisateur ‘root’ :</span><br />
lors de l’installation, il est nécessaire d’écrire dans certains répertoires protégés du système (/etc par exemple) ou d’exécuter certaines taches privilégiées.<br />
Cependant l’installation se fait bien en tant qu’Oracle, et l’installeur demande simplement le privilège root pendant la période nécessaire à ces opérations.<br />
Il execute 2 scripts autonomes root.sh et rootpre.sh, en tant que root.<br />
Il retourne ensuite en mode ‘normal’.<br />
En production les no de ports TCP/IP utilisés par Oracle 10g sont tous &gt; 1024, et ne nécessitent donc pas de privilèges particuliers.<br />
<strong><br />
Sur Windows :</strong><br />
Le principe est plus simple. L’install se fait en général en tant qu’administrateur système.</p>
<h4>DBAs et privilèges d&#8217;exploitation / production</h4>
<div class="post-bodycopy clearfix">
<p>Certains ‘administrateurs’ : les opérateurs et techniciens d’exploitation, ou ‘exploitants’ pour faire court, n’ont pas forcément besoin d’un niveau de privilège DBA.</p>
<p>Les opérations concernés sont par exemple :</p>
<ul>
<li> les démarrage / arrêts,</li>
<li>les sauvegardes / restaurations,</li>
<li>la planification et l’exécution de batch</li>
</ul>
<p>Oracle fournit 2 niveaux de privilèges, qui peuvent être assimilés à des niveaux de connexion, qui satisfont ces besoins : les privilèges d’exploitation ‘SYSDBA’ et ‘SYSOPER’.<br />
Comme tout accès privilégié il s’acquiert via un processus d’identification / authentification.</p>
<p><span class="moduleheading"><strong>Authentification locale au niveau du système d’exploitation</strong> </span></p>
<p>C’est une forme d’authentification externe, en ce sens que ce n’est pas Oracle qui contrôle la connexion grace à son référentiel interne. On se connecte directement (via telnet ou ssh par exemple) au système qui héberge le serveur de données, puis à la base locale, sans plus faire intervenir le réseau.<br />
Ce type de connexion originale ne nécessite pas d’identifiant ni de mot de passe Oracle, mais d’être un utilisateur privilégié au niveau O.S.</p>
<p>note : un utilisateur quelconque, non privilégié de la base, peut aussi être défini avec une authentificatin externe, et se connecter localement avec une commande du type : sqlplus /</p>
<p>On peut dire que dans ce cas la sécrité est déportée au niveau O.S. et qu’Oracle accorde sa ‘confiance’ aux mécanismes d’identification / authentification de ce dernier.</p>
<p>exemples de connexion avec le client SQL standard :</p>
<blockquote>
<pre># connexion 'normale'
$&gt; sqlplus scott/tiger
# connexion avec authentification externe
$&gt; sqlplus / as sysdba
$&gt; sqlplus / as sysoper</pre>
</blockquote>
<p>Pour obtenir un ‘privilège’ d’exploitation il suffit d’appartenir au groupe utilisateur correspondant au niveau système :</p>
<blockquote>
<pre><span style="font-size: small;">privilège  gpe unix    groupe windows
---------  --------    --------------
SYSDBA     dba         ORA_DBA
SYSOPER    oper        ORA_OPER</span></pre>
</blockquote>
<p>Ces groupes sont créés lors de l’installation, et un administrateur système en ‘hérite’ automatiquement</p>
<p>note : Le ‘CONNECT INTERNAL’ des versions précédentes est définitivement obsolète et a été remplacé par le ‘CONNECT SYS AS SYSDBA. Parallèlement il n’est plus possible de se connecter SYS ‘tout court’ sans préciser ‘AS SYSDBA’.</p>
<p><span class="moduleheading"><strong>Authentification distante au niveau du système d’exploitation</strong> </span></p>
<p>Elle présente les mêmes caratéristiques que précédemment sauf que la base est située sur une machine distante de la connexion système courante.</p>
<p>La syntaxe de connexion devient donc :</p>
<blockquote>
<pre>$&gt;  sqlplus /@nom_base_distante AS SYSDBA (ou SYSOPER)</pre>
</blockquote>
<p>Un paramètre d’initialisation de la base : REMOTE_OS_AUTJENTICATION=TRUE autorise cette fonctionnalité.</p>
<p>Note importante : il est vivement conseillé pour des raisons de sécurité d’invalider cette possibilité.</p>
<p><strong><span class="moduleheading">Authentification via fichier de mots de passe</span><br />
</strong>Dans ce cas de figure, les privilèges seront controlés à partir d’un fichier de mot de passe cryptés local.<br />
exemple de création du fichier :<br />
$ ORAPWD FILE=monfic PASSWORD=monpasse ENTRIES=100<br />
avec<br />
PASSWORD : le mot de passe de SYS<br />
ENTRIES : le nb mas d’utilisateurs référencables dans le fichier.</p>
<p>on peut ensuite créer un utilisateur TOTO avec mot de passe TUTU et que le DBA lui donne le privilège oracle (et non pas système cette fois) nécessaire : SYSDBA ou SYSOPER :</p>
<blockquote>
<pre>$&gt; sqlplus / AS SYSDBA
SQL&gt; CREATE USER TOTO IDENTIFIED BY TUTU;
SQL&gt; GRANT CREATE SESSION TO TOTO; -- qu'il ait le droit de se connecter quand même...
$ GRANT SYSDBA TO TOTO ; --et lui donner le privilège d'exploitation qui va bien</pre>
</blockquote>
<p>note : le paramètre d’initialisation REMOTE_LOGIN_PASSWORDFILE doit être à EXCLUSIVE (c’est le défaut) pour pouvoir utiliser et modifier le password file</p>
<h4>DBAs et privilèges Oracle</h4>
<div class="post-bodycopy clearfix">
<p>Un utilisateur Oracle (déclaré au sein de la base, à distinguer de l’utilisateur au niveau OS) peut être DBA.<br />
Il a tous les ‘privilèges système’ AU SEIN DE LA BASE, et le droit de les transmettre (ADMIN OPTION)<br />
Grace à quoi, il peut essentiellement :</p>
<ul>
<li> consulter et mettre à jour (SELECT, UPDATE, INSERT, DELETE) toutes les données utilisateur de la base</li>
<li>créer, modifier des structures de données utilisateur (CREATE, ALTER, DROP) n’importe ou (ANY TABLESPACE)</li>
<li>gérer des utilisateurs et des droits (CREATE/DROP USER, GRANT, REVOKE)</li>
<li>consulter la totalité du dictionnaire</li>
<li>exécuter des ordres d’administration purs (CREATE DATABASE, DATAFILE, TABLESPACE)</li>
</ul>
<p>Il y a 2 utilisateurs privilégiés prédéfinis, SYS et SYSTEM (dont les mots de passe sont définis à la création de la base ou par ‘ORAPWD’)<br />
Ils sont tous les 2 DBA, mais SYS est plus privilégié en ce sens qu’il est propriétaire des tables et des vues du dictionnaire.</p>
<p>Il existe un ensemble de privilèges (ROLE) prédéfinis nommés ‘DBA’ qui donne les privilèges nécessaires à un DBA.<br />
Après avoir créé un utilisateur ‘normal’ il suffit de lui donner ce rôle pour en faire un DBA :</p>
<blockquote><p>SQL&gt; GRANT DBA TO dupont;</p></blockquote>
<p>note : Il existe un autre rôle prédéfini, parmi quelques dizaines, qui est également intéressant c’est le role ‘SELECT_CATALOG_ROLE’. Il est souvent utilisé par des progiciels ou applicatifs utilisant Oracle pour récupérer des méta-données.</p>
<p>Pour plus d’infos sur les droits, rôles et privilèges voir les chapitres correspondants.</p></div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/dba/24-dba-s-et-privileges/feed/</wfw:commentRss>
		</item>
		<item>
		<title>2.1 - Qu&#8217;est ce qu&#8217;un DBA ?</title>
		<link>http://coursdba.estsurinternet.com/dba/21-quest-ce-quun-dba/</link>
		<comments>http://coursdba.estsurinternet.com/dba/21-quest-ce-quun-dba/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 14:49:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[2 - Administration d'Oracle (DBA)]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=692</guid>
		<description><![CDATA[<p>D.B.A. = Data Base Administrator = Administrateur de bases de données.
Il est responsable du bon fonctionnement de toutes les bases de données de l‘entreprise (bases de développement, test, qualification, préproduction, infocentre et production).</p>

Les taches du DBA

Installer le logiciel, faire les mises à jour (patchs, changement de version du noyau mais aussi des autres produits)


Créer les [...]]]></description>
			<content:encoded><![CDATA[<p>D.B.A. = Data Base Administrator = Administrateur de bases de données.<br />
Il est responsable du bon fonctionnement de toutes les bases de données de l‘entreprise (bases de développement, test, qualification, préproduction, infocentre et production).</p>
<h4><a href="http://coursdba.estsurinternet.com/wp-content/uploads/dbman_head1.gif"><img class="alignleft size-full wp-image-759" style="margin: 20px;" title="dbman_head1" src="http://coursdba.estsurinternet.com/wp-content/uploads/dbman_head1.gif" alt="dbman_head1" width="98" height="78" /></a></h4>
<h4>Les taches du DBA</h4>
<ul>
<li>Installer le logiciel, faire les mises à jour (patchs, changement de version du noyau mais aussi des autres produits)</li>
</ul>
<ul>
<li>Créer les bases de données physiques et gérer l’espace physique,</li>
<li> Gérer les utilisateurs et leurs droits d’accès,</li>
<li> Valider les schémas de données (cohérence, non redondance, optimisation),</li>
<li> crééer les objets du schéma : table, index, viues, &#8230;</li>
<li> Assurer la sécurité de la base (sauvegarde, restauration, confidentialité d’accès),</li>
<li> surveiller le système, gérer les ressources et optimiser les performances,</li>
<li> Faire les transferts de données de et vers d’autres systèmes,</li>
<li> contacter le support technique&#8230;ou Google</li>
</ul>
<p>Son travail peut être assimilé à celui d&#8217;un responsable système, Oracle pouvant être perçu comme un &#8217;sous&#8217; système d&#8217;exploitation.</p>
<h4>Les utilisateurs d&#8217;une base Oracle :</h4>
<ul>
<li> le dba lui même</li>
<li>le déve loppeur d&#8217;application</li>
<li>l&#8217;administrateur d&#8217;application</li>
<li>l&#8217;utilisateur final (normal ou infocentre / web)</li>
</ul>
<h4>Les interlocuteurs du DBA :</h4>
<ul>
<li>les développeurs</li>
<li>les administrateurs système (unix/linux, windows, etc.)</li>
<li>le support tecnique Oracle</li>
<li>le support technique interne</li>
<li>l&#8217;admlinistrateur sécurité (s&#8217;il existe)</li>
<li>et plus rarement &#8230;les utilisateurs</li>
</ul>
<h4>Les &#8216;privilèges&#8217; DBA</h4>
<p>Un DBA pour pouvoir travailler doit posséder un certain niveau de privilèges</p>
<ul>
<li>au niveau OS</li>
<li>au niveau de la base de données</li>
</ul>
<p>Sous Unix / Linux<br />
le DBA doit avoir un compte Unix particulier, généralement baptisé Oracle, qui appartient à un groupe prédéfini Unix baptisé DBA. Les fichiers composant le logiciel et les process d&#8217;Oracle, appartiendront à cet utilisateur. Pour certaine étapes de l&#8217;installation (notamment création du user, et mise à jour des fichiers de démarrage, et des paramètres système) le DBA devra les privilèges &#8216;root&#8217;.<br />
Sous Windows<br />
le DBA devra appartenir au groupe administrateur, notamment pour démarrer les services Oracle sur le serveur.<br />
&#8216;Sous&#8217; Oracle<br />
le DBA devra avoir reçu l&#8217;ensemble de droit (prédéfini) Oracle baptisé rôle &#8216;DBA&#8217;. Ceci lui permettra notamment d&#8217;avoir une vision complète du référentiel de la base de données et d&#8217;accéder sans restrictions à toutes les données utilisateurs.<br />
remarque : les utilisateurs standards SYS et SYSTEM de la base de données ont les droits DBA.</p>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/dba/21-quest-ce-quun-dba/feed/</wfw:commentRss>
		</item>
		<item>
		<title>1.3 - Oracle en 10 minutes&#8230;et en video!</title>
		<link>http://coursdba.estsurinternet.com/concepts-de-base/13-oracle-en-10-minutes/</link>
		<comments>http://coursdba.estsurinternet.com/concepts-de-base/13-oracle-en-10-minutes/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 13:30:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[1 -Introduction]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=631</guid>
		<description><![CDATA[<p>Pour les Internautes pressés d&#8217;arriver à un résultat  nous allons relever ici un défi, (grace aux compétences et aux qualités pédagogiques de Stephane Faroult, consultant International sur les technologies Oracle) :</p>
<p>Présenter l&#8217;architecture d&#8217;Oracle à des débutants, en vidéo , en Français et en moins de 10 minutes !

</p>
]]></description>
			<content:encoded><![CDATA[<p>Pour les Internautes pressés d&#8217;arriver à un résultat <img src='http://coursdba.estsurinternet.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> nous allons relever ici un défi, (grace aux compétences et aux qualités pédagogiques de Stephane Faroult, consultant International sur les technologies Oracle) :</p>
<p>Présenter l&#8217;architecture d&#8217;Oracle à des débutants, en vidéo , en Français et en moins de 10 minutes !<br />
<BR><br />
<iframe width="425" height="349" src="http://www.youtube.com/embed/qmThw4p37Vo" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/concepts-de-base/13-oracle-en-10-minutes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>exo72 - installer et tester un &#8216; instant client &#8216; 11gR2</title>
		<link>http://coursdba.estsurinternet.com/exercices/installer-et-tester-un-instant-client-11gr2/</link>
		<comments>http://coursdba.estsurinternet.com/exercices/installer-et-tester-un-instant-client-11gr2/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 20:06:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[G -Exercices]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=541</guid>
		<description><![CDATA[<p>0) télécharger l&#8217;instant client 11gR2 lite + sqlplus
(rendez vous sur otn.oracle.com rubrique &#8216;téléchargement&#8217;, version 11gR2
1) creer un répertoire d&#8217;accueil genre c:oracle_iclient_11gr2
2) dézipper tous les fichier dans CE répertoire
3) positionner (étendre) le PATH dans vos variable d&#8217;environnement SYSTEME pour pointer sur LE répertoire qui contient SQL*Plus
4) tester une connexion EZconnect avec SQL*Plus vers un serveur distant</p>
<p>par [...]]]></description>
			<content:encoded><![CDATA[<p>0) télécharger l&#8217;instant client 11gR2 lite + sqlplus<br />
(rendez vous sur otn.oracle.com rubrique &#8216;téléchargement&#8217;, version 11gR2<br />
1) creer un répertoire d&#8217;accueil genre c:oracle_iclient_11gr2<br />
2) dézipper tous les fichier dans CE répertoire<br />
3) positionner (étendre) le PATH dans vos variable d&#8217;environnement SYSTEME pour pointer sur LE répertoire qui contient SQL*Plus<br />
4) tester une connexion EZconnect avec SQL*Plus vers un serveur distant</p>
<p>par exemple : nom_logique_du_serveur ou @IP : 10.28.18.33<br />
port 1521<br />
service : XE<br />
user/passwd : HR/HR</p>
<p>(Vérifier que le pare-feu du serveur ne bloque pas les entrées sur le port 1521)</p>
<p>5) 5) faire en sorte de résoudre un nom logique de connexion (Alias Oracle*Net) pour se connecter simplement avec<br />
sqlplus hr/hr@HR</p>
<p>créer un TNSNAMES.ORA sur le client avec les bonnes informations<br />
(utiliser un fichier SAMPLE)<br />
faire en sorte que Oracle retrouve ce fichier avec la variable d&#8217;environnement<br />
TNS_ADMIN</p>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/exercices/installer-et-tester-un-instant-client-11gr2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>exoB3 - Mini audit de sécurité d&#8217;une base Oracle</title>
		<link>http://coursdba.estsurinternet.com/exercices/mini-audit-de-securite-dune-base-oracle/</link>
		<comments>http://coursdba.estsurinternet.com/exercices/mini-audit-de-securite-dune-base-oracle/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 21:17:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[G -Exercices]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=539</guid>
		<description><![CDATA[<p>-1) lister les comptes / schémas préinstallés sur Oracle (date de création ?). Vérifier leur statut : ouvert ou verrouillé
- 2) lister les users ayant le rôle DBA
- 3) lister les users ayant un privilège système de type &#8216;ANY&#8217;
- 4) lister les users ayant le privilège execute sur les objets stockés de SYS
- 5) vérifier [...]]]></description>
			<content:encoded><![CDATA[<p>-1) lister les comptes / schémas préinstallés sur Oracle (date de création ?). Vérifier leur statut : ouvert ou verrouillé<br />
- 2) lister les users ayant le rôle DBA<br />
- 3) lister les users ayant un privilège système de type &#8216;ANY&#8217;<br />
- 4) lister les users ayant le privilège execute sur les objets stockés de SYS<br />
- 5) vérifier les paramètres sensibles de sécurité de la base : notamment REMOTE_OS_AUTHENT, UTL_FILE, AUDIT_TRAIL<br />
- 6) Vérifier les permissions des fichiers du noyau Oracle et de la DB<br />
- 7) vérifier les utilisateurs unix ou WIndows appartenant au groupe DBA</p>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/exercices/mini-audit-de-securite-dune-base-oracle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>B.5 - Audit Oracle</title>
		<link>http://coursdba.estsurinternet.com/droits-dacces/audit-oracle/</link>
		<comments>http://coursdba.estsurinternet.com/droits-dacces/audit-oracle/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 10:46:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[B -Sécurité]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=535</guid>
		<description><![CDATA[Oracle - dba - Audit des opérations sur la base
Audit, vous avez dit audit ?
<p>L&#8217;audit Oracle est une des possibilités de surveillance de l&#8217;activité    de la base de données :</p>

 pour contrôler les accès à la base, à des fins de      sécurité,
pour vérifier que tel ou tel [...]]]></description>
			<content:encoded><![CDATA[<h1><span style="font-size: x-small;">Oracle - dba - Audit des opérations sur la base</span></h1>
<h2><a name="audit"></a>Audit, vous avez dit audit ?</h2>
<p>L&#8217;audit Oracle est une des possibilités de surveillance de l&#8217;activité    de la base de données :</p>
<ul>
<li> pour contrôler les accès à la base, à des fins de      sécurité,</li>
<li>pour vérifier que tel ou tel objet est accédé en lecture      ou en écriture (sécurité ou analyse de performance),</li>
<li>pour vérifier les tentatives d&#8217;accès infructueuses à      des objets,</li>
<li>pour contrôler l&#8217;audit éventuellement pirate !</li>
</ul>
<p>Les résultats sont stockés dans une table du dictionnaire : SYS.AUD$<br />
et préférablement accédés à travers des vues    prédéfinies. Ceci permet de faire des requêtes SQL sur le résultat    et éventuellement de produire des rapports sophistiqués.</p>
<p><strong>type de résultat fourni :</strong></p>
<ul>
<li>no session ,</li>
<li>nom du User ,</li>
<li>no/nom du Terminal ,</li>
<li>nom de l&#8217;objet accédé ,</li>
<li>type d&#8217;ordre SQL ou de commande ,</li>
<li>Date d&#8217;occurence.</li>
</ul>
<p><img src="http://didier.deleglise.free.fr/dba/crossbones.gif" alt="" width="32" height="32" /> la table SYS.AUD$ et les    vues DBA_% ne sont bien sur accessibles qu&#8217;au DBA&#8230;</p>
<p><img src="http://didier.deleglise.free.fr/dba/crossbones.gif" alt="" width="32" height="32" /><img src="http://didier.deleglise.free.fr/dba/crossbones.gif" alt="" width="32" height="32" /> la table SYS.AUD$ doit être surveillée et purgée par un    DELETE (ou mieux un TRUNCATE) explicite de Mr SYS si nécessaire</p>
<h2><a name="vues"></a>Les vues d&#8217;audit dans le dictionnaire de données</h2>
<p>Les vues d&#8217;audit sont normalement créées par CATALOG.SQL, et    + précisément par le script CATAUDIT.SQL, lors de la création    de la base.</p>
<table class="RuleInformalWide" border="1" cellspacing="0" cellpadding="3" width="72%">
<thead>
<tr class="Informal">
<th class="Informal" width="27%" align="left" valign="bottom"> <span style="font-family: Arial,Helvetica,sans-serif;"><strong>Vue        d&#8217;audit </strong></span></th>
<th class="Informal" width="73%" align="left" valign="bottom"> <span style="font-family: Arial,Helvetica,sans-serif;"><strong>Description</strong></span> du        contenu</th>
</tr>
</thead>
<tbody>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">STMT_AUDIT_OPTION_MAP</p>
</td>
<td class="Informal" width="73%">
<p class="TB">code des types d&#8217;option</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">AUDIT_ACTIONS</p>
</td>
<td class="Informal" width="73%">
<p class="TB">codes des actions</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">ALL_DEF_AUDIT_OPTS</p>
</td>
<td class="Informal" width="73%">
<p class="TB">otion d&#8217;audit OBJET part défaut</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">DBA_STMT_AUDIT_OPTS</p>
</td>
<td class="Informal" width="73%">
<p class="TB">options d&#8217;audit courantes</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">DBA_PRIV_AUDIT_OPTS</p>
</td>
<td class="Informal" width="73%">
<p class="TB">options d&#8217;audit SYSTEME courantes</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%" height="43">
<p class="TB">DBA_OBJ_AUDIT_OPTS, USER_OBJ_AUDIT_OPTS</p>
</td>
<td class="Informal" width="73%" height="43">
<p class="TB">options d&#8217;audit sur tous les objets et sur ceux du USER</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">DBA_AUDIT_TRAIL,<br />
USER_AUDIT_TRAIL</td>
<td class="Informal" width="73%">
<p class="TB">toutes les entrées d&#8217;audit et celles concernant uniquement          le USER</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">DBA_AUDIT_OBJECT,<br />
USER_AUDIT_OBJECT</td>
<td class="Informal" width="73%">
<p class="TB">toutes les entrées d&#8217;audit OBJET et celles concernant          uniquement le USER</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%" height="41">
<p class="TB">DBA_AUDIT_SESSION,<br />
USER_AUDIT_SESSION</td>
<td class="Informal" width="73%" height="41">
<p class="TB">les entrées d&#8217;audit concernant toutes les (dé)connexions          et celles concernant uniquement le USER</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">DBA_AUDIT_STATEMENT, USER_AUDIT_STATEMENT</p>
</td>
<td class="Informal" width="73%">
<p class="TB">les entrées d&#8217;audit concernant GRANT, REVOKE, AUDIT,          NOAUDIT, et ALTER SYSTEM de tous ou du user connecté</p>
</td>
</tr>
<tr class="Informal" align="LEFT" valign="TOP">
<td class="Informal" width="27%">
<p class="TB">DBA_AUDIT_EXISTS</p>
</td>
<td class="Informal" width="73%">
<p class="TB">les entrées d&#8217;audit concernant AUDIT EXISTS et AUDIT          NOT EXISTS.</p>
</td>
</tr>
</tbody>
</table>
<h2><a name="autorisation"></a>Autorisation de Mise en route de l&#8217;audit</h2>
<p>il faut positionner le paramètre de démarrage AUDIT_TRAIL dans    le fichier INIT.ORA de la base.</p>
<p>3 valeurs possibles :</p>
<ul>
<li>NONE : invalide l&#8217;audit (valeur par défault)</li>
<li>DB : valide l&#8217;audit et stocke les résultats dans la table d&#8217;audit</li>
<li>OS : valide l&#8217;audit et stocke les résultats dans un fichier externe      (un autre paramètre : AUDIT_FILE_DEST précise le répertoire      de destination&#8230;)</li>
</ul>
<blockquote><p>SQL&gt; &#8212; on modifie le paramètre AUDIT_TRAIL qui n&#8217;est pas dynamique<br />
SQL&gt; ALTER SYSTEM SET AUDIT_TRAIL=&#8217;DB&#8217; SCOPE=SPFILE;<br />
SQL&gt; SHUTDOWN ABORT;<br />
SQL&gt; STARTUP</p></blockquote>
<p><img src="http://didier.deleglise.free.fr/dba/crossbones.gif" alt="" width="32" height="32" /><img src="http://didier.deleglise.free.fr/dba/crossbones.gif" alt="" width="32" height="32" /> attention cette opération nécessite l&#8217;arrêt / démarrage    de la base et NE DEMARRE PAS L&#8217;AUDIT !!</p>
<h2><a name="declenchement"></a>Déclenchement effectif de l&#8217;audit (ciblé)    par le DBA ou un user autorisé</h2>
<p>Il existe 4 niveaux d&#8217;audit :</p>
<ul>
<li>connexion / déconnexion : surveille les connexions</li>
<li>ordre SQL : audit par type d&#8217;ordre SQL utilisé</li>
<li>privilège : audit d&#8217;un privilège SYSTEM (SELECT ANY, DROP      ANY, CREATE ANY, * ANY&#8230;)</li>
<li>objet : un ordre SQL particulier sur un objet particulier (audit SELECT      sur SCOTT.EMP)</li>
</ul>
<p>A chaque niveau d&#8217;audit, on peut de + surveiller aussi bien LES SUCCES que    LES ECHECS, et avoir une entrée d&#8217;audit par commande utilisateur ou globalement    pour la session.</p>
<p>Le déclenchement de l&#8217;audit effectif se fait par <strong>la commande AUDIT    et une ou des option(s)</strong>, qui précise(nt) :</p>
<ul>
<li>le type d&#8217;action à auditer,</li>
<li>si l&#8217;on veut les tentatives réussies ou échouées,</li>
<li>pour une session globale ou pour chaque ordre SQL</li>
</ul>
<p>Exemples :</p>
<blockquote><p><span class="exemple">SQL&gt; CONNECT WHENEVER NOT SUCCESSFULL</span><br />
<em>&#8211; surveille toutes les tentatives de connexions infructueuses</em></p>
<p><span class="exemple">SQL&gt; AUDIT CREATE ANY PROCEDURE<br />
BY ACCESS<br />
WHENEVER SUCCESSFULL</span><br />
<em>&#8211; audit système : surveille les création de procédures    réussies nsur toutes la base, une entrée par commande passée.</em></p>
<p><span class="exemple">SQL&gt; AUDIT SELECT TABLE, DELETE TABLE<br />
BY SESSION<br />
WHENEVER NOT SUCCESSFUL</span><br />
<em>&#8211; surveille les select et insert infructueux sur n&#8217;importe quelle table, une    entrée seulement par session</em></p>
<p><span class="exemple">SQL&gt; AUDIT INSERT ON scott.dept</span><br />
<em>&#8211; audit objet : surveille les insertion (réussies ou échouées)    sur la table DEPT de SCOTT</em></p></blockquote>
<h2><a name="verif"></a>Vérification des options d&#8217;audit en cours</h2>
<p>Il suffit d&#8217;aller consulter les vues adéquates du dictionnaire de données    (%AUDIT_OPTS) : ALL_DEF_AUDIT_OPTS  , DBA_STMT_AUDIT_OPTS  , DBA_PRIV_AUDIT_OPTS     , DBA_OBJ_AUDIT_OPTS, USER_OBJ_AUDIT_OPTS</p>
<p>exemple</p>
<blockquote><p><span class="exemple">SQL&gt; SELECT * FROM sys.dba_obj_audit_opts<br />
WHERE owner = &#8216;SCOTT&#8217; AND object_name LIKE &#8216;EMP%&#8217;;</span></p>
<p>OWNER OBJECT_NAME OBJECT_TY ALT AUD COM DEL GRA IND INS LOC<br />
&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212; &#8212; &#8212; &#8212; &#8212; &#8212; &#8212; &#8212; &#8212;<br />
SCOTT DEPT TABLE -/S -/- -/- A/- -/- S/S -/- -/- &#8230;<br />
SCOTT D VIEW -/- -/- -/- -/A -/- -/- -/- -/- &#8230; <span style="font-family: Courier New,Courier,mono; font-size: small;"><br />
</span></p>
<p><span style="font-family: Courier New,Courier,mono; font-size: x-small;"><br />
</span><span style="font-size: x-small;">&#8216;-&#8217; : pas d&#8217;audit<br />
&#8216;S&#8217; : par session<br />
&#8216;A&#8217; : un par accès<br />
à gauche du &#8216;/&#8217; : Successful<br />
à droite du &#8216;/&#8217; : Not successful</span></p></blockquote>
<p><span style="font-size: x-small;">La première ligne nous donne :<br />
audit de la table DEPT de SCOTT : Alter not successfull, par session + delete    successful par accès + creation d&#8217;index reussie ou échouée,    par session !</span><span style="font-family: Courier New,Courier,mono; font-size: x-small;"><br />
</span></p>
<h2><a name="res"></a>Selection des résultats dans les vues d&#8217;audit</h2>
<p>Faire un SELECT sur %_AUDIT_OBJECT ou %_AUDIT_SESSION ou %_AUDIT_STATEMENT</p>
<p>Exemple :</p>
<blockquote><p><span class="exemple">SQL&gt; select OS_USERNAME, USERNAME, TERMINAL, TIMESTAMP<br />
FROM dba_audit_session;</span></p>
<p>OS_USERNAME USERNAME TERMINAL TIMESTAMP<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
TOTO TOTO pts/2 20-AUG-01<br />
oracle SCOTT pts/3 20-AUG-01</p>
<p><span class="exemple">SQL&gt; select OS_USERNAME, USERNAME,TERMINAL,<br />
TIMESTAMP, OWNER, OBJ_NAME,<br />
from dba_audit_object; OS_USERNAME</span></p>
<p>USERNAME TERMINAL TIMESTAMP OWNER OBJ_NAME<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
SCOTT pts/3 20-AUG-01 SCOTT EMP</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/droits-dacces/audit-oracle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>gestion des statistiques</title>
		<link>http://coursdba.estsurinternet.com/corriges/gestion-des-statistiques/</link>
		<comments>http://coursdba.estsurinternet.com/corriges/gestion-des-statistiques/#comments</comments>
		<pubDate>Mon, 30 May 2011 21:47:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[H - Corrigés]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=525</guid>
		<description><![CDATA[<p>Vérification des statistiques collectées pour HR :</p>
SQL&#62; select table_name, last_analyzed
  2  from user_tables;
TABLE_NAME		       LAST_ANAL
------------------------------ ---------
REGIONS 		       13-MAY-11
LOCATIONS		       13-MAY-11
JOBS			       13-MAY-11
EMPLOYEES		       13-MAY-11
JOB_HISTORY		    [...]]]></description>
			<content:encoded><![CDATA[<p>Vérification des statistiques collectées pour HR :</p>
<pre>SQL&gt; select table_name, last_analyzed
  2  from user_tables;
TABLE_NAME		       LAST_ANAL
------------------------------ ---------
REGIONS 		       13-MAY-11
LOCATIONS		       13-MAY-11
JOBS			       13-MAY-11
EMPLOYEES		       13-MAY-11
JOB_HISTORY		       13-MAY-11
COUNTRIES		       13-MAY-11
DEPARTMENTS		       13-MAY-11</pre>
<p>Nous sommes le 30 le Job a l&#8217;air un peu ancien&#8230;</p>
<p>Vérification de la collecte automatique des statistiques à la console :</p>
<blockquote>
<pre>SERVEUR &gt; Oracle Scheduler &gt; Tache de maintenance automatisée.</pre>
</blockquote>
<p>Vérification de la date de création de la base :</p>
<pre>SQL&gt; select name, created
  2  from v$database;
NAME	  CREATED
--------- ---------
DD	  13-MAY-11

CQFD</pre>
<blockquote>
<pre></pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/corriges/gestion-des-statistiques/feed/</wfw:commentRss>
		</item>
		<item>
		<title>plan d&#8217;exécution d&#8217;un ordre SQL et explain plan</title>
		<link>http://coursdba.estsurinternet.com/h-optimisation/plan-dexecution-dun-ordre-sql-et-explain-plan/</link>
		<comments>http://coursdba.estsurinternet.com/h-optimisation/plan-dexecution-dun-ordre-sql-et-explain-plan/#comments</comments>
		<pubDate>Mon, 30 May 2011 14:24:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[E - Optimisation]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=528</guid>
		<description><![CDATA[<p>Il est possible de voir globalement le temps écoulé lors de l&#8217;exécution d&#8217;une requête SQL grace à l&#8217;option SQL*Plus &#8216; SET TIMING ON&#8217;</p>
<p>Il est possible de visualiser &#8216;manuellement&#8217; le plan d&#8217;exécution d&#8217;une requête SQL particulière grace à la commande &#8216;explain plan&#8217;.</p>
<p>Cette commande utilise une table système d&#8217;oracle, nommée PLAN_TABLE qui stocke les ligne correspondant au [...]]]></description>
			<content:encoded><![CDATA[<p>Il est possible de voir globalement le temps écoulé lors de l&#8217;exécution d&#8217;une requête SQL grace à l&#8217;option SQL*Plus &#8216; SET TIMING ON&#8217;</p>
<p>Il est possible de visualiser &#8216;manuellement&#8217; le plan d&#8217;exécution d&#8217;une requête SQL particulière grace à la commande &#8216;explain plan&#8217;.</p>
<p>Cette commande utilise une table système d&#8217;oracle, nommée PLAN_TABLE qui stocke les ligne correspondant au plan d&#8217;exécution choisi par l&#8217;optimiseur.<br />
il existe un package PLSQL fourni par Oracle ( DBMS_XPLAN ) qui permet de visualiser le résultat formatté du plan d&#8217;exécution.<br />
Voir l&#8217;exemple ci-après :</p>
<blockquote>
<pre>Se connecter à SH et lister les quantités et montant total des ventes par produitson

SQL&gt; connect SH/SH
SQL&gt; set timing on

SQL&gt; select prod_name, sum(quantity_sold), sum(amount_sold)
from products p, sales s
 where p.prod_id= s.prod_id
 group by p.prod_name

71 rows selected.
Elapsed: 00:00:01.12

SQL&gt; explain plan for
select prod_name, sum(quantity_sold), sum(amount_sold)
from products p, sales s
 where p.prod_id= s.prod_id
 group by p.prod_name

SQL&gt; -- on configure un peu l'affichage
SQL&gt; set pagesize 30
SQL&gt; set linesize 150
SQL&gt; select * from table(dbms_xplan.display)

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 504757596

----------------------------------------------------------------------------------------------------
| Id  | Operation        | Name       | Rows  | Bytes | Cost (%CPU)| Time       | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |       |    71 |  4260 |   558  (14)| 00:00:07 |       |       |
|   1 |  HASH GROUP BY        |       |    71 |  4260 |   558  (14)| 00:00:07 |       |       |
|*  2 |   HASH JOIN        |       |    72 |  4320 |   557  (14)| 00:00:07 |       |       |
|   3 |    VIEW         | VW_GBC_5 |    72 |  2160 |   553  (14)| 00:00:07 |       |       |
|   4 |     HASH GROUP BY    |       |    72 |  1152 |   553  (14)| 00:00:07 |       |       |
|   5 |      PARTITION RANGE ALL|       |   918K|    14M|   498   (4)| 00:00:06 |     1 |    28 |
|   6 |       TABLE ACCESS FULL | SALES    |   918K|    14M|   498   (4)| 00:00:06 |     1 |    28 |
|   7 |    TABLE ACCESS FULL    | PRODUCTS |    72 |  2160 |     3   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("P"."PROD_ID"="ITEM_1")</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/h-optimisation/plan-dexecution-dun-ordre-sql-et-explain-plan/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Optimisation grace aux vues matérialisées</title>
		<link>http://coursdba.estsurinternet.com/corriges/optimisation-grace-aux-vues-materialisees-2/</link>
		<comments>http://coursdba.estsurinternet.com/corriges/optimisation-grace-aux-vues-materialisees-2/#comments</comments>
		<pubDate>Fri, 27 May 2011 19:06:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[H - Corrigés]]></category>

		<guid isPermaLink="false">http://coursdba.estsurinternet.com/?p=500</guid>
		<description><![CDATA[
1) creer si necessaire le schema SH avec les scripts fournis

sous SQL+ lancer la requete suivante

SQL&#62; SELECT p.prod_subcategory, t.calendar_month_desc, c.cust_city,
       SUM(s.amount_sold) AS sum_amount_sold,
       COUNT(s.amount_sold) AS count_amount_sold
FROM   sales s, products p, times t, customers c
WHERE  s.time_id=t.time_id
AND    s.prod_id=p.prod_id
AND  [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<pre>1) creer si necessaire le schema SH avec les scripts fournis

sous SQL+ lancer la requete suivante

SQL&gt; SELECT p.prod_subcategory, t.calendar_month_desc, c.cust_city,
       SUM(s.amount_sold) AS sum_amount_sold,
       COUNT(s.amount_sold) AS count_amount_sold
FROM   sales s, products p, times t, customers c
WHERE  s.time_id=t.time_id
AND    s.prod_id=p.prod_id
AND    s.cust_id=c.cust_id
and t.calendar_year=1999
and country_id='US'
GROUP BY p.prod_subcategory, t.calendar_month_desc, c.cust_city;

2) Que fait elle ?
Verifier son temps d'execution : 

SQL&gt; SET TIMING ON
...
...
...
22016 rows selected.
Elapsed: 00:00:05.62

3) afficher le PLAN d'execution

SQL&gt; set linesize 160
SQL&gt; select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 790960488

------------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |   360K|    28M|       |  9096   (2)| 00:01:50 |       |       |
|   1 |  HASH GROUP BY               |           |   360K|    28M|    31M|  9096   (2)| 00:01:50 |       |       |
|*  2 |   HASH JOIN                  |           |   360K|    28M|       |  2119   (3)| 00:00:26 |       |       |
|   3 |    TABLE ACCESS FULL         | PRODUCTS  | 10000 |   224K|       |    61   (0)| 00:00:01 |       |       |
|*  4 |    HASH JOIN                 |           |   360K|    20M|  1016K|  2054   (3)| 00:00:25 |       |       |
|*  5 |     TABLE ACCESS FULL        | CUSTOMERS | 34445 |   605K|       |   183   (5)| 00:00:03 |       |       |
|*  6 |     HASH JOIN                |           |   360K|    14M|       |   893   (5)| 00:00:11 |       |       |
|*  7 |      TABLE ACCESS FULL       | TIMES     |   365 |  7300 |       |     9   (0)| 00:00:01 |       |       |
|   8 |      PARTITION RANGE SUBQUERY|           |  1016K|    21M|       |   874   (4)| 00:00:11 |KEY(SQ)|KEY(SQ)|
|   9 |       TABLE ACCESS FULL      | SALES     |  1016K|    21M|       |   874   (4)| 00:00:11 |KEY(SQ)|KEY(SQ)|
------------------------------------------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("S"."PROD_ID"="P"."PROD_ID")
   4 - access("S"."CUST_ID"="C"."CUST_ID")
   5 - filter("COUNTRY_ID"='US')
   6 - access("S"."TIME_ID"="T"."TIME_ID")
   7 - filter("T"."CALENDAR_YEAR"=1999)

4) creer une VM correspondante

SQL&gt; CREATE MATERIALIZED VIEW MV_VENTES1
AS SELECT p.prod_subcategory, t.calendar_month_desc, c.cust_city,
       SUM(s.amount_sold) AS sum_amount_sold,
       COUNT(s.amount_sold) AS count_amount_sold
FROM   sales s, products p, times t, customers c
WHERE  s.time_id=t.time_id
AND    s.prod_id=p.prod_id
AND    s.cust_id=c.cust_id
and t.calendar_year=1999
and country_id='US'
GROUP BY p.prod_subcategory, t.calendar_month_desc, c.cust_city;

5) Verifier le temps d'execution sur la VM

SQL&gt; explain plan for
  2  select * from mv_ventes1;
Explained.

SQL&gt;
SQL&gt; select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1210413503

-----------------------------------------------------------------------------------
| Id  | Operation            | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |            | 18830 |  1397K|    30   (4)| 00:00:01 |
|   1 |  MAT_VIEW ACCESS FULL| MV_VENTES1 | 18830 |  1397K|    30   (4)| 00:00:01 |
-----------------------------------------------------------------------------------

6) verifier si le QUERY REWRITE est actif sur la base

SQL&gt;  show parameter query

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled                string      TRUE
query_rewrite_integrity              string      enforced

7) créer une nouvelle VM comme la precedente mais avec l'option QUERY REWRITE

 <img src='http://coursdba.estsurinternet.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> re tester le SELECT de depart...

SQL&gt; explain plan for
  2  SELECT p.prod_subcategory, t.calendar_month_desc, c.cust_city,
  3         SUM(s.amount_sold) AS sum_amount_sold,
  4         COUNT(s.amount_sold) AS count_amount_sold
  5  FROM   sales s, products p, times t, customers c
  6  WHERE  s.time_id=t.time_id
  7  AND    s.prod_id=p.prod_id
  8  AND    s.cust_id=c.cust_id
  9  and t.calendar_year=1999
 10  and country_id='US'
 11  GROUP BY p.prod_subcategory, t.calendar_month_desc, c.cust_city;

Explained.

SQL&gt; select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3325364141

-------------------------------------------------------------------------------------------
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |            | 25025 |  1857K|    30   (4)| 00:00:01 |
|   1 |  MAT_VIEW REWRITE ACCESS FULL| VM_VENTES2 | 25025 |  1857K|    30   (4)| 00:00:01 |
-------------------------------------------------------------------------------------------</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://coursdba.estsurinternet.com/corriges/optimisation-grace-aux-vues-materialisees-2/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

