Friday, 27 April 2012

CLOB Oracle




CLOB ORACLE


cette procédure vous permettra de parser un contenu clob de type script SQL

Ensuite, elle va éxécuter le contenu SQL, par le bias du

package DBMS_SQL. On peut aussi subsitutuer le contenu du clob en un

ensemble d'instruction et utilisé : EXECUTE IMMEDIATE.

dans cette exemple, je vous montre la première option.




 

declare
    v_sql  CLOB;
     v_num        NUMBER := 0;
    v_upperbound NUMBER;
      v_sql        DBMS_SQL.VARCHAR2S;
      v_cur        INTEGER;
      v_ret        NUMBER;
    begin
     -- Build a very large SQL statement in the CLOB
    LOOP
    IF  v_num = 0 THEN
         v_sql := 'CREATE VIEW vw_tmp AS SELECT ''le nombre de ligne est : 
'||to_char(v_num,'fm0999999')||''' as col1 FROM DUAL'; 
ELSE
         v_sql := v_sql || ' UNION ALL SELECT ''Le nombre de ligne est :
'||to_char(v_num,'fm0999999')||''' as col1 FROM DUAL';
 END IF;
      v_num := v_num + 1;
       EXIT WHEN DBMS_LOB.GETLENGTH(v_sql) > 40000 OR v_num > 800;
     END LOOP;
    DBMS_OUTPUT.PUT_LINE('Length:'||DBMS_LOB.GETLENGTH(v_sql));
     DBMS_OUTPUT.PUT_LINE('Num:'||v_num);
     -- décomposer le clob en bloc de 256 caractères et les mètres dans un tableau VARCHAR2S
    
     v_upperbound := CEIL(DBMS_LOB.GETLENGTH(v_sql)/256);
     FOR i IN 1..v_upperbound
     LOOP
       v_sql(i) := DBMS_LOB.SUBSTR(v_sql,256 -- amount
                                        	  ,((i-1)*256)+1 -- offset
                                  );
     END LOOP;
     --
     --Parsé puis éxécuter le script sql
     v_cur := DBMS_SQL.OPEN_CURSOR;
     DBMS_SQL.PARSE(v_cur, v_sql, 1, v_upperbound, FALSE, DBMS_SQL.NATIVE);
     v_ret := DBMS_SQL.EXECUTE(v_cur);
     DBMS_OUTPUT.PUT_LINE('View Created');
  end;












Sunday, 15 January 2012

Merge sur Oracle

Oracle: la commande Merge  

Merge help you to update and insert a new record with the same instruction.
the following present the syntax of it.

MERGE INTO Table1 T1
USING (SELECT Id, fields FROM Table2) T2
ON ( T1.Id = T2.Id ) -- Matching condition
WHEN MATCHED THEN -- true
UPDATE SET T1.fields = T2.fields --many fields with separator (,)
WHEN NOT MATCHED THEN -- false
INSERT (T1.ID, T1.fields) VALUES ( T2.ID, T2.fields);

 

Example

 
>SQLPLUS scott/tiger


Oracle Database 10g Release 10.2.0.1.0 - Production

SQL> SET LINESIZE 130
SQL>   CREATE Table product (
  2  Id Number (10),
  3  Ref VARCHAR2 (16),
  4  Price NUMBER (12,2));
SQL> Table created
SQL>CREATE SEQUENCE Seq_Id_Pro START WITH 1 INCREMENT BY 1;

SQL>INSERT INTO product VALUES (Seq_Id_Pro.NextVal, '001',    5.50);
SQL>INSERT INTO product VALUES (Seq_Id_Pro.NextVal, '002',  3.5);
SQL>INSERT INTO product VALUES (Seq_Id_Pro.NextVal, '004',    5.99);

SQL>COMMIT;

--the second table
SQL>  
CREATE Table Temp_Product (
2 Ref VARCHAR2 (16),
3 Price NUMBER (12,2));
SQL> Table created
SQL>INSERT INTO Temp_Product VALUES ('001', 6.99);
SQL>INSERT INTO Temp_Product VALUES ('002',2.5);
SQL>INSERT INTO Temp_Product VALUES ('003', 2.99);
SQL>INSERT INTO Temp_Product VALUES ('004', 5.5);
SQL>INSERT INTO Temp_Product VALUES ('005', 4.9);
SQL>COMMIT;
  
  
SQL>   MERGE INTO Product P
    2  USING (SELECT Ref, price FROM Temp_Product) T
    3   ON (P.Ref = T.Ref)
    4  WHEN MATCHED THEN 
    5  UPDATE SET P.Price = T.Price -- you can other fields 
    6 WHEN NOT MATCHED THEN 
    7  INSERT (P.Id, P.Ref,  P.Price) VALUES (Seq_Id_Pro.NextVal, T.Ref, T.Price);
  
SQL>5 records matched.

--when you do select on table product you will find update of the
   price and a new records inserted.
;

SQL>select * from product;

        ID REF                   PRICE
---------- ---------------- ----------
         1 001                    6,99
         2 004                     5,5
         3 002                     2,5
         7 003                    2,99
         8 005                     4,9


--know we have upadate and new records at the same times.

 

Sunday, 27 November 2011

Gestion Utilisateur sous Oracle

Rôle et Utilisateurs sous Oracle

1 - Profil et utilisateur.

Afin d'augmenter la sécurité de la base de données il peut être très interessant
de mettre en place une gestion des mots de passe comme le nombre maximal de tentatives
de connexion à la base, le temps de vérouillage d'une compte, etc...
Il peut parfois aussi être intéressant de limiter les ressources système
allouées à un utilisateur afin d'éviter une surcharge inutile du serveur.
dans cette exemple, je vous montre la création des utilisateur,role sous Oracle.

 



1:Créer deux utilisateurs;	

 Create user  yani   identified by saw ;
 Create user  sami   identified by tiger ;

2:Consulter le dictionnaire pour visualiser ces users;
   select username, account_status from dba_users
	        where username in('YANI','SAMI');
	
3:Accorder le privelege connect au premier user;
   Grant  connect  to yani;	
  
4: Consulter le dictionnaire de YANI
    desc user_objects;
	select object_name,object_type  from user_objects;
	
Lancer un script;
  create  table avion 
( id number(5),
nom varchar2(25));
e  table avion

R à la ligne 1 :
1031: privilèges insuffisants   
--On n'a pas attribuer le privelge ressource

5: Les rôles CONNECT et RESOURCE avec le droit d’accorder ses privilèges 2éme user;

 Grant connect, resource to sami;

6:	Quel profil a été accordé à ces utilisateurs:  
         select *  from dba_profiles
          where profile='DEFAULT';
  
  
 7:  profile utilisateurs
       desc dba_users
	   select profile from dba_users  where  username in ('YANI','SAMI');


		
         		
	   
11: Autoriser le premier utilisateur à créer des tables 
    -accorder son privilège au deuxième  utilisateur
		 GRANT CREATE ANY TABLE TO YANI WITH ADMIN OPTION;   
         Grant connect, resource to yani;

12 Retirer le droit de create de  table
 REVOKE CREATE ANY TABLE FROM YANI;


Creation de rôle
    create role  gestion;
 2-associer des privelge a ce role
      grant  connect, create any table, create view  to gestion;
 
   
 Afficher les roles sys  
  1  select * from dba_sys_privs
  2* where grantee='GESTION'
  3  ;

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
GESTION                        CREATE VIEW                              NO
GESTION                        CREATE ANY TABLE                         NO

 
 --les resources
 select * from dba_sys_privs
 where grantee='RESOURCE';
 
 GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE INDEXTYPE                         NO
RESOURCE                       CREATE TABLE                             NO




-limit les utilisateurs sur les profils;
-Modification du profil par défaut
-limiter le temps de connexion d'une session non active à 60 mn

 ALTER PROFILE DEFAULT
LIMIT IDLE_TIME 60;

-création d'un profil pour la gestion des connexions
-limiter à 5 essais la tentative de connexion
-le nombre de changements de mots de passe avant de pouvoir réutiliser
-un mot de passe qui a déjà été employé
-Nombre de jours qui doivent s'écouler avant qu'un mot de passe puisse 
-être réutilisé 
1--Profile 01
CREATE PROFILE connexion 
LIMIT FAILED_LOGIN_ATTEMPS 4
PASSWORD_REUSE_MAX 3
PASSWORD_REUSE TIME UNLIMITED;

2-- Profile 02
CREATE PROFILE connexion01
   LIMIT
   SESSIONS_PER_USER         3         --- Accorder  De 03 tentatives Pour Utilisateurs
   CPU_PER_SESSION           DEFAULT    --- CPU Par User    
   CPU_PER_CALL              DEFAULT    
   CONNECT_TIME              DEFAULT      
   IDLE_TIME                 60         --- 60 Jours   
   LOGICAL_READS_PER_SESSION DEFAULT 
   LOGICAL_READS_PER_CALL    DEFAULT   
   COMPOSITE_LIMIT           DEFAULT 
   PRIVATE_SGA               DEFAULT 
   ;
   
   --Creation de fonction
 CREATE OR REPLACE FUNCTION complexite_pwd (username VARCHAR2,password VARCHAR2,old_password VARCHAR2)
  RETURN boolean IS 
BEGIN
IF (length(password)<06) THEN
raise_application_error(-20009, 'ERROR: Le mot de passe doit être supérieur à 06 caractére');

END IF;

return True;
END; 
/ 

Activer cette fonction avec modification commande.
ALTER PROFILE    connexion01 LIMIT PASSWORD_VERIFY_FUNCTION complexite_pwd;
 
VERIFIER 
 Create user  sami1 identified by tiger01
 PROFILE connexion01
 PASSWORD EXPIRE ;
 
 Grant connect,resource to sami1
 

3-- Profile 03
create profile   prof_connexion
limit
sessions_per_user
cpu_per_session            10000    : centiéme de seconde
cpu_per_call               1        : centiéme de seconde
connect_time               unlimited  : minutes
idle_time                  30         : minutes
logical_reads_per_session  default    : db blocks
logical_reads_per_call     default  :  db blocks
                                           
private_sga                20M    
failed_login_attempts      3    :Nombre d'erreurs permises à la saisie 
	                        du mot de passe avant que le compte soit verrouillé
password_life_time         60    : duréé de vie mot passe puis changé (jours)
password_reuse_time        12   : peut pas réutiliser le mot de passe déja 
	                        utiliser avant 12 jours
password_reuse_max         unlimited    :Nombre de changement de mots de passe requis
                                          avant de pouvoir ré-utiliser un mot de passe déjà utilisé
password_lock_time         default    :Durée (en jours) pendant laquelle un compte sera verrouillé 
                                         après qu'il ait atteint le nombre d'erreurs permises 
			                    à la saisie de son mot de passe (FAILED_LOGIN_ATTEMPTS),days
password_grace_time        2    : En cas de péremption d'un mot de passe dû à un délai
                                         fixé par l'administrateur
                                         cette option permet de paramétrer une durée (en jours) pendant  
					laquelle l'utilisateur pourra tout de même se 
					connceter, mais recevra un avertissementdays
password_verify_function  null ;  --permet de préciser une fonction
                           (PL/SQL) vérifiant la compexité du mot de passe.
  
 Exemple de fonction
 
 CREATE OR REPLACE FUNCTION restrict_pwd_change (username VARCHAR2,
password VARCHAR2,
old_password VARCHAR2)
RETURN boolean IS 
BEGIN
raise_application_error(-20009, 'ERROR: Modification du mot de passe impossible');
END; 
/ 

4--Consulter  les profils
       SELECT profile, resource_name, limit
             FROM Dba_Profiles
              WHERE resource_type = 'PASSWORD'
              ORDER BY profile;  

	

Activer cette fonction par la commande suivante :

ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION restrict_pwd_change;

--Pour désactiver cette restriction, utilisez cette commande :

ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION null; 
		  
 
 --associer le profile au utilisateurs
 ALTER USER Yani  PROFILE connexion01;