J'ai essayé ça mais ça ne semble pas fonctionner (le trigger est erroné)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 create or replace trigger logon_session_trigger AFTER LOGON ON DATABASE BEGIN alter session set NLS_SORT=BINARY_CI; alter session set NLS_COMP=LINGUISTIC; END; /
Alter session ne peut pas être employé directement dans PL/SQL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE OR REPLACE TRIGGER logon_session_trigger AFTER LOGON ON DATABASE BEGIN if sys_context('USERENV','SESSION_USER') = 'MNI' Then Execute Immediate 'ALTER session SET NLS_SORT=BINARY_CI'; Execute Immediate 'ALTER session SET NLS_COMP=LINGUISTIC'; end if; END; /
Ce déclencheur, ce n'est que la cosmétique finale.
L'essentiel du boulot n'est pas là.
Il faut déjà vérifier que ce paramétrage sur NLS_SORT et NLS_COMP a bien les effets attendus sur les recherches. Ca doit marcher non seulement avec un critère d'égalité (WHERE ... =), mais aussi avec n'importe quel autre opérateur de comparaison : > <> BETWEEN LIKE.
Mais surtout, vous allez devoir revoir l'indexation de toutes vos colonnes texte, car NLS_COMP=LINGUISTIC rendra vos index standard inopérants.
Vous devrez donc créer des index fonctionnels sur les colonnes appropriées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 SQL> select * from scott.emp where ename='SCoTT'; aucune ligne sélectionnée Plan d'exécution ---------------------------------------------------------- Plan hash value: 48385638 ----------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IND_ENAME | 1 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("ENAME"='SCoTT') SQL> alter session set nls_comp=linguistic; Session modifiée. SQL> SQL> select * from scott.emp where ename='SCoTT'; aucune ligne sélectionnée Plan d'exécution ---------------------------------------------------------- Plan hash value: 3956160932 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| EMP | 1 | 38 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(NLSSORT("ENAME",'nls_sort=''FRENCH''')=HEXTORAW('691E5A6E6E00010102010100') )
Eh oui, les recherches sans tenir compte de la casse ont de très grosses conséquences, ça n'est pas un simple paramétrage qu'on fait en un claquement de doigts.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 SQL> create index NLS_ENAME on scott.emp(nlssort(ename, 'nls_sort=binary_ci')); Index créé. SQL> select * from scott.emp where ename='SCoTT'; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7788 SCOTT ANALYST 7566 19/04/87 3000 20 Plan d'exécution ---------------------------------------------------------- Plan hash value: 2230589022 ----------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | NLS_ENAME | 1 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access(NLSSORT("ENAME",'nls_sort=''BINARY_CI''')=HEXTORAW('73636F747400'))
Consultant / formateur Oracle indépendant
Certifié OCP 12c, 11g, 10g ; sécurité 11g
Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration
Merci pour vos aides ! Je vais étudier cela de près !
Sinon, comment peut on gérer ou plutôt contourner le fait que pour Oracle, une chaine de caractère vide "" soit NULL ? J'estime que si j'insère "", je dois avoir "" (comme chez MySQL ou SQL Serveur) ... car sinon, quand je récupère la donnée et que je l'affiche, j'affiche NULL et pas ""
Merci
Il y a une différence entre connexion et session.
Dans un pool de connexion Oracle, la connexion physique est effectivement conservée mais pas la session.
Donc chaque récupération d'un connexion fait systématiquement l'objet d'un logon et le trigger sera déclenché pour une même connexion chaque fois l'on la récupère du pool.
Par contre, si c'est un pool de session, la c'est différent...
Vincent Rogier.
Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog
Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !
OCILIB (C Driver for Oracle)
Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Merci pour ces précisions importantes !
Oracle ne permet tout simplement pas de modifier ces paramétrages en dure une bonne fois pour toute ?
Edite ton fichier init.ora pour définir/modifier les paramètres globaux de ta base de données.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager