BI experience

3 février 2012
par maryam khiali
0 Commentaires

Charger un DUMP Oracle

Exemple de contexte : vous êtes en société de service, afin de réaliser un POC, un client vous fournit un dump Oracle.

Première chose à faire : poser certaines questions au client :

  • Les informations NLS_DATABASE_PARAMETERS : pour construire l’instance Oracle avec les bonnes informations de NLS_CHARACTERSET et de NLS_NCHAR_CHARACTERSET (SELECT * FROM NLS_DATABASE_PARAMETERS)
  • Les users utilisés
  • Les rôles utilisés et les droits de chacun
  • La liste des tablespaces que vous pourrez avoir à recréer à la main
  • Le type d’export qui a été fait ( car il en existe 2 qui sont gérés de manières différentes : exp, expdp
  • L’espace disque utilisé car un backup peut faire une taille X mais quand il est déployé sa taille peut doubler voir tripler avec les tablespaces par exemple.

Après avoir créé votre instance Oracle et après avoir prévu la place nécessaire, ouvrez une fenêtre « cmd » :

Pour accéder en ligne de commande à votre instance vous pouvez taper :

C:\>sqlplus « / as sysdba »

A partir de là vous allez pouvoir créer un user :

CREATE USER monUser IDENTIFIED BY motDePasse;

Ensuite créer un rôle pour votre user :

CREATE role monRole;

GRANT CREATE cluster, create sequence , create synonym, create table, create view, create procedure, create trigger, CREATE public synonym, drop public synonym, create role, create any synonym, drop any synonym, drop any materialized view to monRole;

Et on affecte monUser à monRole :
GRANT unlimited tablespace, monRole to monUser;

Pour créer les tablespaces :

CREATE TABLESPACE USER_DATA DATAFILE ‘F:\dump\user_data.dbf’ SIZE 210m AUTOEXTEND ON NEXT 210;

Pour l’import 2 possibilités :

1) imp userid=monUser  file=C:\Users\Administrateur\Desktop\monDump.dmp FULL=Y log=C:\log.log;

2) CREATE DIRECTORY mondirectory AS ‘F:\dump’;

impdp monUser/motDePasse full=Y directory=mondirectory dumpfile=monDump.dmp

Problème de droit? Vous pouvez exécuter cette requête dans SQL Oracle développer, pendre le résultat et l’exécuter :

Select ‘GRANT SELECT ,INSERT,UPDATE,DELETE ON  ‘ || TABLE_NAME || ‘  TO UCPA_DEV;’ FROM USER_TABLES
Select ‘CREATE PUBLIC SYNONYM  ‘ || TABLE_NAME || ‘  FOR  ‘ || TABLE_NAME || ‘;’ FROM USER_TABLES

Un problème que j’ai rencontré :

lors du chargement d’un DUMP les vues matérialisées ont été chargées comme des tables.

Je n’ai pas encore tout compris sur Oracle mais ces petites commandes m’ont permis de mener à bien le chargement de mon DUMP client.

Si vous aussi vous avez  des astuces à nous transmettre, n’hésitez pas, commentez!

8 janvier 2012
par maryam khiali
3 Commentaires

Configurer une connexion Oracle pour Microsoft SQL Server

Je ne sais pas si vous avez déjà essayé de connecter sql server à une base de données Oracle mais ce n’est pas si simple que ça…

contexte :

  • Il y a une machine1 avec sql server installé sur du windows 2008 64 bits
  • Il y a une machine2 avec la base de données oracle installé sur du windows 2008 64 bits

première étape télécharger les drivers oracle : les clients oracle.

Astuce 1 : le site d’Oracle est horrible dès que l’on veut trouver quelque chose c’est comme si on cherchait une aiguille dans une botte de foin. Donc voici les liens de télechargement du client 32bits et du clients 64 bits

Astuce 2 : il faudra installer les deux et bien respecter l’ordre d’installation : client 32 bits puis client 64 bits.

Astuce 3 :malgré le fait que nous soyons sur du 64 bits SSIS pour se connecter on ira regarder le client 32 bits. Donc il faudra configurer les listener.ora et tnsname.ora pour les deux clients 64 bits et 32 bits.

Après avoir configuré vos fichiers dans répertoire Oracle>product>NETWORK>ADMIN>clien_X

vous pourrez vérifier votre accès à la base de données en ouvrant une fenêtre cmd et en tapant tnsping servicename.

exemple : tnsping orcl

si cela fonctionne vous pourrez dans SSIS utiliser les providers suivants sans problème:

  • Microsoft DB provider for oracle
  • Oracle provider for OLEDB

En espérant que ce post évite à quelqu’un de perdre trop de temps sur ce genre de problématique, j’attends votre opinion sur la chose…N’hésitez pas commentez!

17 novembre 2011
par maryam khiali
0 Commentaires

Une mission acomplie : cio-online.com

Mardi 15 Novembre, Actuate donnait un show pour montrer à ses utilisateurs l’intérêt de leur solution. Ils m’avaient proposé de faire partie des témoignages clients. J’ai donc pu présenter l’aboutissement de mon projet. Nous avons même reçu un award!

A la suite de ce témoignage un journaliste nous a  interviewé mon équipe et moi et voici les 2 articles publiés :

C’est vraiment une bonne conclusion à mon projet avant de partir vers de nouveaux horizons.

16 septembre 2011
par maryam khiali
0 Commentaires

Besoin d’un bilan de compétences?

Vous cherchez un nouveau poste?  Vous avez besoin de faire un bilan de compétences pour mieux connaitre votre profil, vos attentes par rapport à la prochaine entreprise que vous choisirez ou encore pour le prochain poste qu’on vous proposera?

Ce site : mareussite.com, vous permettra de faire un bilan sur vous-même. Quatre tests sont proposés :

  • Test personnalité permet de vous expliquer  « le pourquoi et le comment de chacune de vos tendances »
  • Réussir au travail mettra en exergue  « la manière dont votre personnalité s’exprime sur le plan professionnel : votre façon de travailler, de prendre des décisions, de gérer votre temps »
  • Trouver sa voie vous permettra de comprendre  » ce qui vous motive au travail, choisir sa carrière en fonction de votre personnalité, de construire un plan d’action »
  • Savoir rebondir vous permettra d’être plus « performant dans vos recherches d’emploi, de valoriser votre candidature, comprendre vos réactions face à cette période de transition »

Si vous avez besoin de vous rassurer par rapport à votre parcours, votre carrière n’hésitez pas!

Grâce au code partenaire présent sur cette page . Vous pourrez avoir le test de personnalité gratuit. Le reste est payant.

J’attends vos commentaires sur cet outil!

25 août 2011
par maryam khiali
2 Commentaires

Copier une base de données vers une autre avec Talend

Depuis la version 4.1.2, Talend a sorti une option assez remarquable :le Dynamic Schema

Je vous propose dans ce post de détailler la démarche que nous avons adoptée pour l‘alimentation de notre infocentre : copie des différentes bases de données de la société à partir desquelles le datawarehouse est alimenté.

Un simple job sera réalisé pour amener les données d’une base de données source vers une base de données cible :
job_fils

Voici l’option en question que vous pourrez utiliser dans votre input:

option_dynamic_schema2

Et si vous avez des règles de gestion à ajouter n’hésitez pas avec le tJavaFlex :
action_sur_lignes1

/**l’exemple de traitement en plus lisible…**/
for(int i = 0; i < row3.dyn_Col.metadatas.size(); i++) {
row3.dyn_Col.metadatas.get(i).setName(row3.dyn_Col.metadatas.get(i).getName().toLowerCase());
}

Ce job, décrit ci-dessus, est appelé ainsi par un job père qui lui donne le contexte contenant le nom de la table courante à migrer :

job_pere

Une variable de context est passée au sous job (monsousjobcopie) : my_current_table

L’input requête sur une table de paramétrage. En effet nous n’avons pas forcément besoin de toutes les tables de toutes les bases de données. Donc à travers une table de paramétrage nous choisissons celle que l’on veut migrer :

input_job_pere

Ce job père appelle aussi un autre sous job qui lui va permettre de migrer les indexes :
index

Donc pour chaque table on fera un appel à une routine (code qu’il y a dans le tJava):

routines.IndexMigrer.migrate_index(((java.sql.Connection)globalMap.get(« conn_tMSSqlConnection_2″)), ((String)globalMap.get(« current_TABLE.nom_table »)), ((java.sql.Connection)globalMap.get(« conn_tPostgresqlConnection_4″)),context.Cible_Schema + (String)globalMap.get(« schema ») + « . » +
((String)globalMap.get(« current_TABLE.nom_table »)));

Et en bonus voici la routine que nous avons créée qui selon la base de données (Oracle, Posgres, SQL Server 2000 ou SQL Server 2005) va requêter dans la bonne table système :

/***************Routines migration indexes ************************/

public class IndexMigrer {
public static void migrate_index(Connection org_connect, String org_nomtable,
Connection dest_connect, String dest_nomtable)  throws java.sql.SQLException
{
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase(« Microsoft SQL Server« ) )
{
Statement stat = org_connect.createStatement();
ResultSet rs;
if(org_connect.getMetaData().getDatabaseMajorVersion()==9)
{
rs=stat.executeQuery(« SELECT IDX.name as index_name, COL.name as column_name FROM sys.index_columns IDXC »
+ » INNER JOIN sys.objects OBJ »
+ » ON IDXC.object_id = OBJ.object_id »
+ » INNER JOIN sys.schemas SCH »
+ » ON SCH.schema_id = OBJ.schema_id »
+ » INNER JOIN sys.indexes IDX »
+ » ON (IDXC.object_id = IDX.object_id AND IDXC.index_id = IDX.index_id) »
+ » INNER JOIN sys.columns COL »
+ » ON (IDXC.column_id = COL.column_id AND OBJ.object_id = COL.object_id) »
+ » where OBJ.name=\’ »+org_nomtable+ »\’ »
+ » ORDER BY OBJ.name » );
}
else
{
rs=stat.executeQuery(« select i.name as index_name,c.name as column_name »
+ » from sysindexkeys as indk »
+ » inner join sysindexes as i on »
+ » (indk.indid=i.indid and indk.id=i.id ) »
+ » inner join syscolumns as c on »
+ » (indk.colid=c.colid and indk.id=c.id ) »
+ » inner join sysobjects as o on »
+ » (indk.id=o.id) »
+ » and o.name=\’ »+org_nomtable+ »\’  »
+ » ORDER BY o.name » );
}
Map m =new HashMap();
Map m_key=new HashMap();
while(rs.next())
{
if(!m.containsKey(rs.getString(1)))
{
List l = new ArrayList();
l.add(rs.getString(2));
m.put(rs.getString(1),l);
m_key.put(rs.getString(1), rs.getString(1));
}
else if(m.containsKey(rs.getString(1)))
{
List l=(List)m.get(rs.getString(1));
l.add(rs.getString(2));
m.put(rs.getString(1),l);
}
}
StringBuffer sb=new StringBuffer();
for (Iterator i = m.keySet().iterator() ; i.hasNext();){
String key = (String)i.next();
sb.append(« CREATE INDEX « );
sb.append(« IDX_ »+key);
sb.append( » ON « +dest_nomtable+ » (« );
List l=(List)m.get(key);
for(int j=0;j<l.size();j++)
{
sb.append(l.get(j));
if(j!=l.size()-1)
sb.append(« , »);
}
sb.append(« );\n »);
}
try{
Statement bla=dest_connect.createStatement();
System.out.println(«  »+sb.toString());
bla.execute(sb.toString());
}
catch (java.sql.SQLException e)
{
//System.out.println(dest_nomtable);
System.out.println(e.getMessage());
}
dest_connect.commit();
//System.out.println(dest_nomtable);
}
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase(« PostgreSQL« ))
{
Statement stat = org_connect.createStatement();
ResultSet rs=stat.executeQuery(« SELECT indkey as colonne_index,pci.relname as nom_index,pct.relname as nom_table from pg_index as pi »
+ » , pg_class as pci, pg_class as pct  »
+ » where pci.oid=pi.indexrelid »
+ » and pct.oid=pi.indrelid and pct.relname  not like ‘pg_%’ and pct.relname=’ »+org_nomtable+ »‘  » );
while( rs.next())
{
String s=rs.getString(1);
java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(s,  » « );
List <Integer> num_columns=new ArrayList();
while ( tokenizer.hasMoreTokens() ) {
num_columns.add(Integer.parseInt(tokenizer.nextToken()));
}
Statement sel=org_connect.createStatement();
ResultSet rsset=sel.executeQuery(« SELECT * from « +org_nomtable+ » LIMIT 1″);
StringBuffer sb=new StringBuffer();
sb.append(« CREATE INDEX « +rs.getString(2)+ » ON « +dest_nomtable+ » ( » );
Iterator i=num_columns.iterator();
while(i.hasNext())
{
sb.append(rsset.getMetaData().getColumnLabel((Integer)i.next()));
if(i.hasNext())
sb.append(« , »);
}
sb.append(« ) ;\n »);
Statement bla=dest_connect.createStatement();
bla.execute(sb.toString());
dest_connect.commit();
bla.close();
}
}
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase(« Oracle« ))
{
Statement stat = org_connect.createStatement();
ResultSet rs=stat.executeQuery(« SELECT col.index_name,col.column_name FROM all_indexes cons INNER JOIN all_ind_columns col ON cons.owner = col.index_owner AND cons.index_name = col.index_name WHERE OWNER = ‘AEFE’ AND cons.table_name=\’ »+org_nomtable+ »\’ » );
Map m =new HashMap();
Map m_key=new HashMap();
while(rs.next())
{
if(!m.containsKey(rs.getString(1)))
{
List l = new ArrayList();
l.add(rs.getString(2));
m.put(rs.getString(1),l);
m_key.put(rs.getString(1), rs.getString(1));
}
else if(m.containsKey(rs.getString(1)))
{
List l=(List)m.get(rs.getString(1));
l.add(rs.getString(2));
m.put(rs.getString(1),l);
}
}
StringBuffer sb=new StringBuffer();
for (Iterator i = m.keySet().iterator() ; i.hasNext();){
String key = (String)i.next();
sb.append(« CREATE INDEX « );
sb.append(« IDX_ »+key);
sb.append( » ON « +dest_nomtable+ » (« );
List l=(List)m.get(key);
for(int j=0;j<l.size();j++)
{
sb.append(l.get(j));
if(j!=l.size()-1)
sb.append(« , »);
}
sb.append(« );\n »);
}
Statement bla=dest_connect.createStatement();
System.out.println(«  »+sb.toString());
bla.execute(sb.toString());
dest_connect.commit();
}}}

Très important, si un problème de typage persiste n’hésitez pas à modifier les fichiers de mapping dans :

fichier_mappingCes fichiers sont utiles et simples à utiliser puisqu’ils permettent de connaitre les transformations de typage. En gros voici comment procède Talend :

typage BDD source => typage JAVA => typage BDD cible

Exemple d’utilisation :

ma base de données source est SQL server et ma base de données cible est postgres  :

La démarche sera donc d’aller dans  MSSQL_mapping.xml  et de regarder la rubrique : <dbToTalendTypes> pour voir en quel type Java les typages de ma base de données MSSQL seront transformés. Ensuite il faudra regarder dans postgres_mapping.xml pour regarder les typages par défault que propose Talend dans la rubrique  <talendToDbTypes> pour la retransformation des types JAVA en typages postgres.

Vous pourrez ainsi personnaliser ces transformations.

Si ces fichiers sont modifiés il faudra bien sûr les répercutés sur tous les clients  TIS  et sur le serveur  dans les workspaces dans:

  • .JAVA > src > xmlMappings
  • et dans .JAVA > classes > xmlMappings

J’espère que ce post vous aura permis de voir les possibilités qu’offre la solution Talend pour ce genre de besoin.

N’hésitez pas à poster pour donner votre opinion!