SEC_SENSITIVE_LOGON dans Oracle 11g

Dans Oracle 11g les mots de passe utilisateurs sont par défaut sensibles à la casse sauf s'il s'agit d'une mise à niveau et cela tant qu'une instruction ALTER USER n'est pas utilisé ce qui restaure le comportement èar défaut, mais les noms utiliateurs ne sont pas concerné.
on peut desactiver la sensibilte à la casse on utilisant le nouveau parametere SEC_CASE_SENSITIVE_LOGON , par exemple :

SQL>alter system set SEC_SENSITIVE_LOGON = FALSE;

mais Oracle recommande de garder le comportement par défaut puisque la desactivation augmente les risques des attaques de type brute force contre les mots de passe non sensibles à la casse.

Oracle : Activer la trace du Listener

Parfois pour identifier un problème de connexion à la base de données on à besoin d'activer la trace de listener, pour cela on ajoute les lignes suivantes au fichier listtener.ora :

TRACE_DIRECTORY_LISTENER = C:\oracle\product\10.2.0\db_1\NETWORK\trace
TRACE_FILE_LISTENER = listener.trc
TRACE_LEVEL_LISTENER = support

Les deux premières lignes indique l'emplacement et e nom de fichier de trace, le troisième paramètre TRACE_LEVEL_LISTENER spécifie le niveau de trace, il y a quatre niveau de trace :
0 ou OFF est le niveau par défaut pas de trace.
4 ou USER est un niveau pour détecter les erreurs utilisateur.
6 ou ADMIN pour détecter des problèmes d'installation ou de configuration d'Oracle Net Services.
16 ou SUPPORT c'est le niveau le plus exhaustif il est destiné au support ORACLE.

On recharge le fichier avec :
c:\>lsnrctl reload

La sortie de fichier trace semble à quelque chose comme :
[31-JANV.-2010 17:56:04:500] nsopen: opening transport...
[31-JANV.-2010 17:56:04:500] nttcnp: getting sockname
[31-JANV.-2010 17:56:04:500] nttcnp: getting peername
[31-JANV.-2010 17:56:04:500] nttcnr: waiting to accept a connection.
[31-JANV.-2010 17:56:04:500] nttcnr: getting sockname
[31-JANV.-2010 17:56:04:500] snlinGetNameInfo: Using numeric form of host's address 127.0.0.1
[31-JANV.-2010 17:56:04:500] nttcnr: connected on ipaddr 127.0.0.1
[31-JANV.-2010 17:56:04:500] nttcon: set TCP_NODELAY on 228
[31-JANV.-2010 17:56:04:500] nsopen: transport is open
[31-JANV.-2010 17:56:04:500] nsnainit: inf->nsinfflg[0]: 0xd inf->nsinfflg[1]: 0xd
[31-JANV.-2010 17:56:04:500] nsopen: global context check-in (to slot 5) complete
[31-JANV.-2010 17:56:04:500] nsanswer: deferring connect attempt; at stage 5
[31-JANV.-2010 17:56:04:500] ntt2err: soc 228 error - operation=5, ntresnt[0]=524, ntresnt[1]=997, ntresnt[2]=0
[31-JANV.-2010 17:56:04:500] snttcallback: op = 5, bytes = 87, err = 0
......

la méthode de modification du fichier listener.ora n'est qu'une méthode parmi d'autres, on peut faire la même chose avec les commandes SET TRC_DIRECTORY, SET TRC_FILE, and SET TRC_LEVEL de l'utilitaire lsnrctl, ou à travers l'OEM.

SQL : Group BY ROLLUP

Une fonction bien pratique dans ORACLE depuis la version 9i est la fonction ROLLUP, cette fonction permet d'avoir des agrégations a certain niveaux que group by ne permet pas; analysons l'instruction suivante :
SQL> select deptno,job,sum(sal)
2 from emp group by deptno,job
3 order by deptno;

DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600

9 ligne(s) sélectionnée(s).
L'agrégation avec GROUP BY dans l'instruction précédente n'est utile que si on veut la somme en fonction des deux colonnes DEPTNO et JOB, si on veut aussi la somme en fonction de chaque DEPTNO nous auront deux choses soit faire une interrogation a part et la joindre avec un l'operateur UNION, soit utilisé la fonction ROLLUP :

SQL> select deptno,job,sum(sal)
2 from emp group by rollup(deptno,job)
3 order by deptno;

DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10
8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20
10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30
9400


29025

13 ligne(s) sélectionnée(s).

Remarquer aussi que la fonction ROLLUP permet de donner un total global de tous les départements, l'utilisation de ROLLUP est équivalent a group by() union group by deptno union group by deptno,job :

SQL> select deptno,job,sum(sal)
2 from emp group by deptno,job
3 union
4 select deptno,to_char(null),sum(sal)
5 from emp group by deptno
6 union
7 select to_number(null),to_char(null),sum(sal)
8 from emp;

DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10
8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20
10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30
9400


29025

13 ligne(s) sélectionnée(s).

Une autre fonction utile est la fonction CUBE.

DATA PUMP : Les paramétres REMAP_* dans

Une des fonctionnalités intéressantes de SQL loader c'est qu'il permet de charger des données à partir d'un schéma utilisateur vers un autre schéma utilisateur grâce aux paramètres fromuser et touser, mais avec DATA PUMP dans oracle 11g, c'est encore plus puissant avec les paramètres du genre REMAP_*.

Un équivalent de fromuser touser est le paramètre REMAP_SCHEMA, d'abord un export du schéma HR :

C:\>impdp system/sbd11 DIRECTORY=dpump_dir DUMPFILE=hr.dmp

Puis un import avec le paramètre REMAP_SCHEMA=hr:oe pour charger les objets du schéma HR vers le schéma Scott:

C:\>impdp system/sbd11 DIRECTORY=dpump_dir DUMPFILE=hr.dmp REMAP_SCHEMA=hr:scott

Autre fonctionnalité avec les paramètres de la famille REMAP est REMAP_DATA, et oui un mappage aux niveaux donnés; cela s'avère utile lors d'un chargement des données du prod vers une plateforme de test, voila un exemple :

C:\>expdp hr/hr tables=departments directory=dpump_DIR dumpfile=hrdept.dmp logfile=expdept.log
remap_data:departments.location:remap_pkg.map_loc
remap_data:departments.department_id:remap_pkg.map_id

L'exemple précédent montre un changement les valeurs de colonnes location et departement_id par des valeurs arbitraires (mais de même type!) retournées par des fonctions utilisateur.
Il y a aussi REMAP_TABLE, REMAP_DATAFILE ET REMAP_TABLESPACE

Oracle : Limter l'accés à la base avec le listener

Lorsque on veut limiter les machine à partir de laquelle on veut se connecter, généralement on deux choix soit en le fait avec un déclencheur sur l'événement DATABASE LOGON, soit en le fait au niveau listener est c'est plus simple à implémenter.
On ajoute les deux lignes suivantes dans le fichier sqlnet.ora :

tcp.validnode_checking=YES
tcp.invited_nodes= (hosta1,10.130.1.54,cronix,servpl)

La première ligne active la vérification de la source de connexion, la deuxième spécifie les machines à partir de quelles la connexion est autorisée, vous devez recharger le listener pour que ca prend effet :

C:\>lsnrctl reload

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-JANV.-2010 16:43:13

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))
La commande a réussi

Si vous essayez la connexion à partir d'une autre machine vous aurez le message suivant :
ERROR:
ORA-12537: TNS:connection closed

SQL : Foncion Cube

La fonction CUBE est comme sa petite sœur ROLLUP est une fonction d'agrégation qui permet d'avoir tout les combinaisons entre les composants d'une agrégation, un exemple :
SQL> select deptno,job,sum(sal)
2 from emp group by cube(deptno,job)
3 order by deptno;

DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10
8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20
10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30
9400

ANALYST 6000

CLERK 4150

MANAGER 8275

PRESIDENT 5000

SALESMAN 5600


29025

18 ligne(s) sélectionnée(s).

Le résultat montre quatre agrégations par les deux colonnes (deptno,job), par deptno seulement, par job seulement et le total dans toute la table ce que revient à faire mais avec quatre passages de la table emp alors que la précédente le fait dans un seule passage :
SQL> select deptno,job,sum(sal) from emp group by deptno,job
2 union
3 select to_number(null),job,sum(sal) from emp group by job
4 union
5 select deptno,to_char(null),sum (sal) from emp group by deptno
6 union
7 select to_number(null),to_char(null),sum(sal) from emp;

DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10
8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20
10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30
9400

ANALYST 6000

CLERK 4150

MANAGER 8275

PRESIDENT 5000

SALESMAN 5600


29025
18 ligne(s) sélectionnée(s).

Le nombre d'agrégation de CUBE est 2^nombre de colonnes dans le select, par contre avec ROLLUP on seulement n+1 ou n est le nombre de colonnes dans le select.

SQL : Foncion Rank()

la fonction Rank() est une fonction ananlytique pemettant d'assigner un numero d'ordre à un resultat un exemple simple :
SQL> conn scott/tiger
Connecté.
SQL> select empno,ename,sal from emp order by sal;

EMPNO ENAME SAL
7369 SMITH 800
7900 JAMES 950
7876 ADAMS 1100
7521 WARD 1250
7654 MARTIN 1250
7934 MILLER 1300
7844 TURNER 1500
7499 ALLEN 1600
7782 CLARK 2450
7698 BLAKE 2850
7566 JONES 2975
7788 SCOTT 3000
7902 FORD 3000
7839 KING 5000

14 ligne(s) sélectionnée(s).
maintenant je veux assigné un numero d'ordre pour chaque employé en se basant sur son salaire :
SQL> select empno,ename,sal,rank() over(order by sal) as ord from emp;

EMPNO ENAME SAL ORD
---------- ---------- ---------- ----------
7369 SMITH 800 1
7900 JAMES 950 2
7876 ADAMS 1100 3
7521 WARD 1250 4
7654 MARTIN 1250 4
7934 MILLER 1300 6
7844 TURNER 1500 7
7499 ALLEN 1600 8
7782 CLARK 2450 9
7698 BLAKE 2850 10
7566 JONES 2975 11
7788 SCOTT 3000 12
7902 FORD 3000 12
7839 KING 5000 14

14 ligne(s) sélectionnée(s).

on le meme numero d'ordre pour les employés ayant le meme salaire.

voire le post fonctions analytiques

Vmstat, Top, free...

Pour superviser son system sous linux pas besoin d'utiliser des logiciels tierces une panoplie de commandes est la pour vous servir; une des commandes utilitaires dans est vmstat, celle-ci permet de donner des statistiques sur les process, les IO, l'utilisation de la mémoire, l'utilisation du processeur utiliser sans arguments ca donne la sortie suivantes :oracle@HOST1:~> vmstat



La sortie est divisée en six colonnes chacune contienne des informations spécifiques.
Process :

b pour l'attente de libération de CPU, cette colonne ne doit pas prendre constamment une valeur supérieure à 0.

swap :
si et so pour swap in et swap out ces deux valeurs indique l'échange de blocks SWAP entre la mémoire et les disques ces deux valeurs doivent rester à 0 le plus longtemps possible.

CPU :
CS pour contexte switch indique le nombre de changements de contexte pour le CPU.

id pour idle time le temps d'inactivité du processeur.
wa temps d'attente pour les IO, il ne doit pas être très élevé.

system :
in nombre d'interruption system par seconde.

io :
bi et bo nombre de blocks écrits et lus du disque par seconde.

memory :
Donne des statistiques globales sur la mémoire, tai
lle de mémoire libre, cache, swap.

Une autre commande utile est la commande TOP qui donne une vue en temps réelle sur l'utilisation mémoire, cpu, priorité... pour chaque process et d'autre information utile, la sortie est par défaut trié selon la consommation des ressources la plus couteuse :
oracle@HOST1:~> top


D’autres commandes plus ou moins utiles :
mpstat, iostat, free, sar, ps, netstat...pour plus de détails consulter l'aide en ligne :

oracle@HOST1:~> man free

PL/SQL : La clause AUTHID CURRENT_USER

Quand on appelle une procédure, une fonction ou un package il y a deux modes de privilèges d'exécution :
Soit avec les droits de définition; le code utilisé permet d'accéder aux objets qu'il appelle avec les droits utilisateur qui a écrit ce code.
Soit avec les droits d'invocation; le code est alors appelé avec les droits de l'utilisateur qui appelé le code stocké.
Explication :
L’utilisateur Scott se connecte et fait une select sur la table employees qui est dans le schéma hr :
SQL> select first_name from HR.employees where employee_id=190;
select first_name from HR.employees where employee_id=190
*
ERREUR Ó la ligne 1 :
ORA-00942: Table ou vue inexistante
Il obtient une erreur; alors l'utilisateur HR crée une procédure qui fait la même chose et donne le droit d'exécution a Scott :
SQL> create or replace procedure normale_proc is
2 nom varchar2(20);
3 begin
4 select first_name into nom from employees where employee_id=190;
5 dbms_output.put_line('le nom est :'||nom);
6 end;
7 /
Procédure créée.
SQL> grant execute on normale_proc to scott;
Autorisation de privilèges (GRANT) accepte.
SQL>
Maintenant pour Scott ça donne le résultat suivant :
SQL> set serveroutput on
SQL> exec hr.normale_proc
le nom est :Timothy

Procédure PL/SQL terminée avec succès.
SQL>
Ce genre de fonctionnement peut s'avérer très pratiques si on ne veut pas donner des privilèges sur les objets auxquels il accède notre code, mais il peut s'avérer tres dangereux si notre code contient une quelconque vulnérabilité, par exemple une injection SQL alors les droits d'exécution seront ceux du propriétaire du code.
Pour activer les droits d'invocation pour un code il suffit d'ajouter la clause AUTHID CURRENT_USER avant IS, le même exemple :
SQL> create or replace procedure aut_proc AUTHID CURRENT_USER is
2 nom varchar2(20);
3 begin
4 select first_name into nom from employees where employee_id=190;
5 dbms_output.put_line('le nom est :'||nom);
6 end;
7 /
Procédure créée.

SQL> grant execute on aut_proc to scott;
Autorisation de privilèges (GRANT) acceptée.
SQL>
Maintenant pour Scott ca donne un 942:
SQL> exec hr.aut_proc
BEGIN hr.aut_proc; END;
*
ERREUR Ó la ligne 1 :
ORA-00942: Table ou vue inexistante
ORA-06512: Ó "HR.AUT_PROC", ligne 4
ORA-06512: Ó ligne 1

pour savoir quelle mode d'exécution pour une procédure on consulte la vue user_procedures :
SQL> select OBJECT_NAME,AUTHID from user_procedures
2 where OBJECT_NAME in ('AUT_PROC','NORMALE_PROC');

OBJECT_NAME AUTHID
------------------------------ ------------
AUT_PROC CURRENT_USER
NORMALE_PROC DEFINER

PL/SQL : Le package DBMS_RANDOM

Le package dbms_rnadom dans oracle permet de générer des valeurs aléatoires entres -2^31 et 2^31, pour ce faire vous devez initialiser le générateur pseudo-aléatoire (il n'y a pas de génération aléatoire à 100% dans l'informatique) avec une valeur numérique :
SQL> exec dbms_random.initialize(34);

Procédure PL/SQL terminée avec succès.

La procédure initialize ne prend que des valeurs numériques comme paramètre, une autre procédure qui fait la même chose mais qu'est obsolète est la procédure SEED, le seul avantage de SEED est l'utilisation de chaine de caractère pour initialiser le générateur :
SQL> exec dbms_random.seed('bla bla bla..');

Procédure PL/SQL terminée avec succès.

Une fois le générateur initialisé vous pouvez générer des nombres en appelant la fonction value :
SQL> select dbms_random.value(100,150) from dual;

DBMS_RANDOM.VALUE(100,150)
--------------------------
106,250729

SQL>
La fonction value prend deux paramètres qui constituent la plage dans laquelle les nombres seront générés

Oracle : injection du code PL/SQL

L’attaque du code PL/SQL par une injection SQL est toujours d'actualité malgré son apparition depuis plusieurs années, cela est du généralement aux mauvaises habitudes des développeurs, en gros l'attaque consiste à forgé une autre requête a partir d'une requête qui accepte des paramètres, exemple :
SQL> create or replace procedure vul_proc(param varchar2) is
2 type fir_name is table of hr.employees.first_name%type;
3 fname fir_name := fir_name();
4 stmt varchar2(300);
5 begin
6 stmt:='select first_name from hr.employees where last_name='''||param||'''';
7 execute immediate stmt bulk collect into fname;
8 for i in fname.first..fname.last loop
9 dbms_output.put_line(fname(i));
10 end loop;
11 end;
12 /

Procédure crée.

L’utilisation légitime de cette procédure est :
SQL> set serveroutput on
SQL> exec vul_proc('King')
Janette
Steven
Procédure PL/SQL terminée avec succès.
SQL>
Mais le paramètre param est concaténé à l'instruction stmt sans aucun contrôle ce qui peut donner des idées :
SQL> exec vul_proc('King'' or ''1''=''1 ')
Ellen
Sundar
Mozhe
David
Hermann
Shelli
....

ou pire encore :
SQL> exec vul_proc('King'' union select password from dba_users where ''1''=''1 ')
2BE6F80744E08FEB
2CA614501F09FCCC
2D594E86F93B17A1
3DF26A8B17D0F29F
3FB8EF9DB538647C
4A3BA55E08595C81
4C6D73C3E8B0F0DA
66F4EF5650C20355
71E687F036AD56E5
72979A94BAD2AF80
72E382A52E89575A
7C9BA362F8314299
7EFA02EC7EA6B86F
84B8CBCA4D477FA3
88A2B2C183431F00
88D8364765FCE6AF
8A8F025737A9097A
9793B3777CD3BD1A
9C30855E7E0CB02D
BFBA5A553FD9E28A
CE4A36B8E06CA59C
DF02A496267DEE66
F25A184809D6458D
F894844C34402B67
FA1D2B85B70213F3
FFF45BB2C0C327EC
Janette
Steven
anonymous

Procédure PL/SQL terminée avec succès.
Pour éviter ce genre de situation le mieux sera d'utiliser des variables attachées dans la chaine passer à execute immediate et une clause USING pour utiliser le paramètre :
SQL> create or replace procedure vul_proc(param varchar2) is
2 type fir_name is table of hr.employees.first_name%type;
3 fname fir_name := fir_name();
4 stmt varchar2(300);
5 begin
6 stmt:='select first_name from hr.employees where last_name= :param ';
7 execute immediate stmt bulk collect into fname using param;
8 for i in fname.first..fname.last loop
9 dbms_output.put_line(fname(i));
10 end loop;
11 end;
12 /

Procédure crue.

L’attaque par une injection SQL ne marchera pas, puisque ORACLE précompile l'instruction STMT et il ne permettra qu'un seul paramètre valide qui ne contiendra aucun mot clé SQL :
SQL> exec vul_proc('King'' union select password from dba_users where ''1''=''1 ')
BEGIN vul_proc('King'' union select password from dba_users where ''1''=''1 '); END;

*
ERREUR à la ligne 1 :
ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur
ORA-06512: à "SYS.VUL_PROC", ligne 8
ORA-06512: à ligne 1

Configurer SSH entre deux machines

la communication entre les machines se fait naturellement sur un réseau qui sert de canal de communication en utilisant un protocole, la sécurité de cette communication est affectée par la sécurité de ce protocole, passer les anciens protocoles comme Telnet, rlogin et rsh le plus utilisé en ce moment est ssh, certes ca ne garantie pas une sécurité totale de la communication des failles spécifiques à ce protocole existe; mais il reste le plus sécurisé, ce que je présente ici c'est la configuration de ssh entre deux machines linux, les étapes ci-dessous sont à exécuter dans les deux machines (host1 et host2).
1) en premier lieu en va vérifier si ssh est installé généralement il est les packages ssh sont installés par défaut:
$rpm -qa | grep -i ssh

2)maintenant il faut vérifier si le démon ssh (sshd) est démarré :
$service sshd status

S’il n'est pas démarré il faut le lancer avec :
$service sshd start

Configurer aussi le démarrage automatique de sshd avec :
$chkconfig --level 2345 sshd on

3) maintenant on crée un répertoire /home/root/.ssh :
$mkdir /home/root/.sshd

4) on génère les clés de cryptage RSA et DSA :
$/usr/bin/ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/root/.ssh/id_rsa):<-- accepte="" chemin="" cl="" d="" faut="" la="" le="" on="" ou="" par="" sera="" span="" stock="" style="color: #cc6600; font-family: verdana; font-style: italic;">Enter passphrase (empty for no passphrase): <-- celui="" de="" diff="" entre="" mot="" on="" passe="" rent="" root="" span="" style="color: #cc6600; font-family: verdana; font-style: italic;" un="">Enter same passphrase again:
Your identification has been saved in /home/root/.ssh/id_rsa.
Your public key has been saved in /home/root/.ssh/id_rsa.pub.
The key fingerprint is:
5c:d9:d8:c5:3d:8d:0b:10:33:42:9c:83:45:a1:d0:61 root@host1.com


$/usr/bin/ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/root/.ssh/id_dsa.
Your public key has been saved in /home/root/.ssh/id_dsa.pub.
The key fingerprint is:
5c:d9:d8:c5:3d:8d:0b:10:33:42:9c:83:45:a1:d0:61 root@host1.com


Si vous lister /home/root/ssh vous aurez quatre fichiers de deux types:
id_dsa et id_rsa : contiennent les clés privées DSA et RSA, il ne faut jamais les distribuer.
id_dsa.pub et id_rsa.pub : contiennent les clés publics DSA et RSA.

5) on copie les clés publics dans un fichier qu'on appel authorized_keys :
$cd /home/root/.ssh
$cat /home/root/.ssh/id_rsa.pub >>/home/root/.ssh/authorized_keys
$cat /home/root/.ssh/id_dsa.pub >>/home/root/.ssh/authorized_keys

7) pour l'échange des clés on copie de host1 vers host2 avec :
$scp authorized_keys host2 /home/root/.ssh/authorized_keys_host1
Enter passphrase for key '/home/root/.ssh/id_dsa':<-- cl="" de="" des="" entrer="" et="" g="" host2="" le="" mot="" n="" passe="" ration="" root="" s="" span="">

Dans host2 maintenant vers host1 :
$cat /home/root/.ssh/authorized_keys_host1 >> /home/root/.ssh/authorized_keys
$scp /home/root/.ssh/authorized_keys host1:/home/root/.ssh/authorized_keys

Maintenant le fichier /home/root/.ssh/authorized_keys est le même, jusqu'ici si vous faites à partir de host1:
$ssh host2 uname -a

Vous devez entrer le mot de passe entrer lors de la génération des clés, pour éviter d'entrer ce mot de passe chaque fois;pour cela il suffit de taper dans chaque machine :
$exec /usr/bin/ssh-agent $SHELL
$/usr/bin/ssh-add


EMCA : Creation de l'OEM repository

À partir de la version 10g la base de données Oracle s'est dirigé vers le WEB pour fournir une nouvelle version d'Entreprise Manager à la place de celui de la 9i basé sur java; ainsi que des variantes selon l'utilisation Dbcontrol pour une seule Bd ou grid control pour centraliser la gestion de plusieurs cibles.
La plupart du temps l'installation d'entreprise manager se fait lors de la création de la base (si vous n'opter pas pour le gride control), mais vous pouvez toujours laisser l'installation d'entreprise manager après la création de la base.
Pour l'installer il y de méthodes soit l'outil graphique DBCA, soit un programme en ligne de commande EMCA (pour Entreprise Manager Configuration Assistant) c'est celui dont nous allons parler.
Sans parler de tous les arguments d’EMCA sacher que la syntaxe générale est :
Emca operation mode flag parameters
Et si vous pouvez voire la liste complète en tapant :
>emca -h
Alors pour créer votre console d'administration rien de plus simple après la création de la base tapez :
$ emca -config dbcontrol db -repos create

STARTED EMCA at jun 06, 2010 9:21:39 PM
EM Configuration Assistant, Version 10.2.0.1.0 Production
Copyright (c) 2003, 2005, Oracle. All rights reserved.

Enter the following information:
Database SID: db10
Listener port number: 1521
Password for SYS user: change_on_install
Password for DBSNMP user: manager
Password for SYSMAN user: manager
Email address for notifications (optional):
Outgoing Mail (SMTP) server for notifications (optional):
-----------------------------------------------------------------

You have specified the following settings

Database ORACLE_HOME ................ /u01/app/oracle/product/10.2.0/db_1

Database hostname ................ dbserver
Listener port number ................ 1521
Database SID ................ db10
Email address for notifications ...............
Outgoing Mail (SMTP) server for notifications ...............

-----------------------------------------------------------------
Do you wish to continue? [yes(Y)/no(N)]: Y
jun 06, 2010 10:00:12 PM oracle.sysman.emcp.EMConfig perform
INFO: This operation is being logged at /u01/app/oracle/product/10.2.0/db_1/cfgtoollogs/emca/db10/emca_2010-01-06_09-21-39-PM.log.
jun 06, 2010 10:00:15 PM oracle.sysman.emcp.EMReposConfig createRepository
INFO: Creating the EM repository (this may take a while) ...
jun 06, 2010 10:05:51 PM oracle.sysman.emcp.EMReposConfig invoke
INFO: Repository successfully created
jun 06, 2010 10:06:01 PM oracle.sysman.emcp.util.DBControlUtil startOMS
INFO: Starting Database Control (this may take a while) ...
jun 06, 2010 10:07:49 PM oracle.sysman.emcp.EMDBPostConfig performConfiguration
INFO: Database Control started successfully
jun 06, 2010 10:07:49 PM oracle.sysman.emcp.EMDBPostConfig performConfiguration
INFO: >>>>>>>>>>> The Database Control URL is http://dbserver:1158/em <<<<<<<<<<<
Enterprise Manager configuration completed successfully
FINISHED EMCA at jun 06, 2010 10:07:49 PM


Vous devez fournir quelques informations comme le SID le port listner.., cela prends quelques minutes et vous pouvez suivre les étapes de création, une fois le programme terminé noter l'adresse à la fin (sous forme de http(s)://nommachine:port/em) est lancer la avec votre navigateur
Pour le recréer il suffit de changer create avec recreate dans la commande précédente mais si vous êtes amené à désinstaller entreprise manager la commande suivante suffira :
$ emca -deconfig dbcontrol db -repos drop

STARTED EMCA at jun 06, 2006 9:53:55 PM
EM Configuration Assistant, Version 10.2.0.1.0 Production
Copyright (c) 2003, 2005, Oracle. All rights reserved.

Enter the following information:
Database SID: db10
Listener port number: 1521
Password for SYS user: change_on_install
Password for SYSMAN user: manager

Do you wish to continue? [yes(Y)/no(N)]: Y
jun 06, 2006 9:54:15 PM oracle.sysman.emcp.EMConfig perform
INFO: This operation is being logged at /u01/app/oracle/product/10.2.0/db_1/cfgtoollogs/emca/db10/emca_2006-01-06_09-53-55-PM.log.
jun 06, 2006 9:54:16 PM oracle.sysman.emcp.util.DBControlUtil stopOMS
INFO: Stopping Database Control (this may take a while) ...
jun 06, 2006 9:54:35 PM oracle.sysman.emcp.EMReposConfig dropRepository
INFO: Dropping the EM repository (this may take a while) ...
jun 06, 2006 9:56:48 PM oracle.sysman.emcp.EMReposConfig invoke
INFO: Repository successfully dropped
Enterprise Manager configuration completed successfully
FINISHED EMCA at jun 06, 2006 9:56:48 PM

Il y une autre commande utile pour vérifier le statut d'entreprise manager c'est :
>emctl status dbconsole --qui fournit le statut de la console web.

Et :
>emctl status agent --pour le status de l'agent d'entreprise manager

Vous pouvez arrêter la console avec :
>emctl stop dbconsole

Ou la démarrer avec :
>emctl start dbconsole

SQL : Fonctions LAG et LEAD

Les fonctions LAG et LEAD sont deux fonctions analytiques qui permettent d'accéder à une ligne avant ou après la ligne courante, la syntaxe de ces fonctions est simple :
LAG|lead(colonne, nombre de ligne avant|après la ligne courante, valeur par default pour la première|dérniere ligne).

La valeur par défaut n'est pas obligatoire si vous l'omettez Oracle renvoie NULL à la place, un petit exemple :
SQL> select empno,sal,deptno,sal-lag(sal,1)
2 over (order by empno) as trou
3 from emp order by empno;

EMPNO SAL DEPTNO TROU
7369 800 20
7499 1600 30 800
7521 1250 30 -350
7566 2975 20 1725
7654 1250 30 -1725
7698 2850 30 1600
7782 2450 10 -400
7788 3000 20 550
7839 5000 10 2000
7844 1500 30 -3500
7876 1100 20 -400
7900 950 30 -150
7902 3000 20 2050
7934 1300 10 -1700

14 ligne(s) sélectionnée(s).

L’exemple précédent calcul la différence de salaire entre un employé et celui qui le précède directement dans empno, le suivant calcule l'inverse :

SQL> select empno,sal,deptno,sal-lead(sal,1)
2 over (order by empno) as trou
3 from emp order by empno;

EMPNO SAL DEPTNO TROU
7369 800 20 -800
7499 1600 30 350
7521 1250 30 -1725
7566 2975 20 1725
7654 1250 30 -1600
7698 2850 30 400
7782 2450 10 -550
7788 3000 20 -2000
7839 5000 10 3500
7844 1500 30 400
7876 1100 20 150
7900 950 30 -2050
7902 3000 20 1700
7934 1300 10

14 ligne(s) sélectionnée(s).

voire le post fonctions analytiques