1
votes

Essayer de savoir quelles tables sont exécutées dans l'application externe oracle

Je me demande si cela pourrait être possible ou non.

J'utilise TOAD, connecté à une base de données oracle (11g) et j'ai accès à l'application oracle E-BUSINESS-SUITE.

Fondamentalement, je veux que Toad retrace quels SQL sont exécutés par l'application oracle E-BUSINESS-SUITE

J'ai cette requête:

SELECT nvl(ses.username,'ORACLE PROC')||' ('||ses.sid||')' USERNAME,
       SID,   
       MACHINE, 
       REPLACE(SQL.SQL_TEXT,CHR(10),'') STMT, 
      ltrim(to_char(floor(SES.LAST_CALL_ET/3600), '09')) || ':'
       || ltrim(to_char(floor(mod(SES.LAST_CALL_ET, 3600)/60), '09')) || ':'
       || ltrim(to_char(mod(SES.LAST_CALL_ET, 60), '09'))    RUNT 
  FROM V$SESSION SES,   
       V$SQLtext_with_newlines SQL 
 where SES.STATUS = 'ACTIVE'
   and SES.USERNAME is not null
   and SES.SQL_ADDRESS    = SQL.ADDRESS 
   and SES.SQL_HASH_VALUE = SQL.HASH_VALUE 
   and Ses.AUDSID <> userenv('SESSIONID') 
 order by runt desc, 1,sql.piece


5 commentaires

'du gars' - pourquoi ne pas le faire pour votre propre session? Connectez-vous à ebiz, puis utilisez votre outil pour déterminer votre SID, puis activez une trace de session. Vous aurez besoin d'accéder au serveur sur lequel vivent les fichiers de trace. OU vous pouvez ignorer tout cela et aller simplement plonger dans le schéma ebiz et rechercher des tables / colonnes qui semblent pouvoir stocker vos données


@thatjeffsmith Merci d'avoir répondu. D'accord, j'utiliserai mes propres informations d'identification. Je ne comprends pas tout à fait ceci: "Vous aurez besoin d'accéder au serveur sur lequel vivent les fichiers de trace" pouvez-vous m'aider avec cela? PS: je n'ai aucun schéma, je dois faire ceci :(


Vous avez dit: "connectez-vous à ebiz". Voulez-vous dire vous connecter à la base de données en utilisant TOAD?


@thatjeffsmith J'ai ceci: imgur.com/a/E9ADBGr


vous utilisez l'outil oci scanner quest a qui reniflera le trafic SQL * net de votre machine vers la base de données ... je ne suis plus en mesure de vous aider avec cela


3 Réponses :


1
votes

Le suivi des requêtes exécutées par une application logicielle active peut prendre un certain temps. En tant que tel, il peut être plus facile d'extraire les données d'une autre manière:

Vous voulez savoir quelle table et quelle colonne contiennent certaines données, comme un prénom d'utilisateur.

Générez quelque chose d'unique, comme un GUID ou un nom impossible qui n'apparaît jamais dans votre base de données (comme 'a87d5iw78456w865wd87s7dtjdi') et entrez-le comme prénom à l'aide de l'interface utilisateur. Sauvegardez les données

Exécutez cette requête sur oracle:

TABLE_NAME        COLUMN_NAME
crm_contacts_info first_name

Ceci est "un SQL qui écrit un SQL" - Il générera un jeu de résultats qui est essentiellement une liste d'instructions SQL comme celle-ci:

UNION ALL SELECT 'tablename', 'columnname' FROM tablename WHERE columnname = 'a87d5iw78456w865wd87s7dtjdi'
UNION ALL SELECT 'table2name', 'column2name' FROM table2name WHERE column2name = 'a87d5iw78456w865wd87s7dtjdi'
UNION ALL SELECT 'table3name', 'column3name' FROM table3name WHERE column3name = 'a87d5iw78456w865wd87s7dtjdi'

Il y aura une requête pour chaque colonne de chaque table de la base de données. Au fait, seules les colonnes CHARacter seront recherchées

Supprimez le premier UNION ALL

Exécutez-le et attendez un long moment pendant qu'oracle recherche essentiellement toutes les colonnes de chaque table, dans la base de données, pour votre nom étrange.

Finalement, il produit une sortie comme:

SELECT 
  REPLACE(REPLACE(
    'UNION ALL SELECT ''{t}'', ''{c}'' FROM {t} WHERE {c} = ''a87d5iw78456w865wd87s7dtjdi'' ',
    '{t}', table_name),
    '{c}', column_name
  )  
FROM USER_TAB_COLUMNS WHERE data_type like '%char%'

Donc vous connaissez votre nom a87d5iw78456w865wd87s7dtjdi a été enregistré, par l'interface utilisateur, dans crm_contacts_info.first_name


0 commentaires

1
votes

Si c'est possible, comment pourrais-je obtenir l'identifiant de session du type vous utilisez l'application oracle E-BUSINESS-SUITE?

Oui, c'est certainement possible. Tout d'abord, vous devez déterminer quel schéma / nom d'utilisateur "le gars" utilise. Si vous ne savez pas, vous pouvez demander au gars ou lui demander d'exécuter une requête simple (quelque chose comme sélectionner l'utilisateur à partir de dual; fonctionnera) pour obtenir cette information.

Une fois vous avez le nom du schéma, vous pouvez interroger la table V $ SESSION pour déterminer l'ID de session. Demandez au gars de se connecter, puis interrogez la table V $ SESSION . Votre requête ressemblerait à ceci: select * from v $ session where username = '[SCHEMA]'; [SCHEMA] est le nom de schéma utilisé par le gars pour vous connecter. Cela vous donnera le SID, le numéro de série, le statut, etc. Vous aurez besoin de cette information pour suivre la session du gars.

La génération d'un fichier de trace pour la session est relativement simple. Vous pouvez démarrer une trace pour toute la base de données ou juste pour une session. Puisque vous n'êtes intéressé que par la session du gars, il vous suffit de tracer celle-là. Pour commencer la trace, vous pouvez utiliser une commande qui ressemble à ceci: EXEC DBMS_MONITOR.session_trace_enable (session_id => [SESSIONID], serial_num => [SERIAL #]); [SESSIONID ] et [SERIAL #] sont les chiffres que vous avez obtenus à l'étape précédente. Gardez à l'esprit que le gars devra être connecté pour que la trace de session vous donne des résultats .

Une fois que le gars est connecté et que vous avez activé la trace de session, demandez au gars d'exécuter toutes les commandes de la suite E-Business qui vous intéressent. Sachez que plus le gars (ou l'application ) fait pendant que la trace est activée, plus vous aurez d'informations à parcourir pour trouver ce que vous recherchez. Cela peut être une tonne de données avec des applications. Je vous préviens juste à l'avance.

Une fois que le gars a terminé ses tâches, vous devez désactiver la trace. Cela peut être fait en utilisant le package DBMS_MONITOR comme précédemment, mais légèrement différent. La commande ressemblerait à ceci: EXEC DBMS_MONITOR.session_trace_disable (session_id => [SESSIONID], serial_num => [SERIAL #]); en utilisant le même [SESSIONID] et [SERIAL #] comme avant.

En supposant que tout a été fait correctement, cela générera le fichier de trace. La raison pour laquelle @thatjeffsmith a mentionné l'accès au serveur est que vous devrez accéder au (x) serveur (s) sur lequel vit la base de données afin d'obtenir le fichier de trace. Si vous n'avez pas accès au serveur, vous devrez travailler avec un DBA ou une personne ayant accès pour l'obtenir. Si vous avez juste besoin d'aide pour savoir où se trouve le fichier de trace, vous pouvez exécuter la requête suivante en utilisant le [SESSIONID] d'avant:

SELECT p.tracefile
FROM   v$session s
       JOIN v$process p ON s.paddr = p.addr
WHERE  s.sid = [SESSIONID];

Ceci devrait renvoyer un répertoire qui ressemble à ceci: /u01/app/oracle/diag/rdbms/[databaseletter/[instance circular/trace/[instance circular_ora_010719.trc

Accédez simplement à ce répertoire, extrayez le fichier de trace en utilisant WinSCP, FileZilla ou l'application de votre choix, et cela devrait le faire.

Bonne chance et j'espère que cela vous aidera!


11 commentaires

Vraiment belle explication! Mec, je ne comprends pas cette partie: "Oui, c'est certainement possible. Tout d'abord, vous devez déterminer quel schéma" le gars "utilise. Si vous ne savez pas, vous pouvez demander au gars ou lui faire courir une simple requête (quelque chose comme sélectionner l'utilisateur à partir de dual; fonctionnera) pour obtenir ces informations. " L'autre gars n'a que des informations d'identification pour l'application oracle e-business-suite, je pense qu'il n'a aucune idée du schéma utilisé et il ne peut exécuter aucune requête sur l'application: /


Si j'utilise cette requête: sélectionnez * de v $ session où username = '[SCHEMA]' en utilisant mon propre nom d'utilisateur ne correspond à rien, pourquoi?


Heureux d'avoir pu aider! Bien que je ne sois pas sûr de votre environnement, je parierais que le nom d'utilisateur que l'autre gars utilise pour se connecter à l'application est le même que son schéma de base de données. Demandez-lui simplement le nom d'utilisateur, puis interrogez la table V $ SESSION et confirmez qu'il s'agit bien de lui. Vous pouvez également simplement interroger la table 'ALL_USERS' ou simplement demander à quelqu'un de plus familier avec l'application pour ces détails. Si la requête de sélection de session v $ ne fonctionne pas, vérifiez la casse de votre condition de nom d'utilisateur. Si votre nom d'utilisateur est stocké en majuscules, votre requête doit correspondre. [SCHEMA] n'est pas la même chose que [Schema] ou [schema].


Si j'utilise cette requête: sélectionnez l'utilisateur de dual, il me montre mon nom d'utilisateur. Quand j'essaye d'exécuter l'autre requête: sélectionnez * à partir de v $ session où username = '[MYUSERNAME]' il affiche des lignes vides. Pourquoi? Avez-vous une idée?


Il y a quelques possibilités: 1.) Le nom d'utilisateur / schéma ([MYUSERNAME]) n'a aucune session active sur la base de données et vous vous êtes connecté avec un nom d'utilisateur / schéma différent. 2.) Vous n'entrez pas correctement le nom d'utilisateur / schéma. Essayez la requête avec votre nom d'utilisateur / schéma en MAJUSCULES et entouré de «guillemets simples». 3.) Il existe un type de déclencheur étrange qui empêche l'affichage des messages d'erreur et ne renvoie à la place aucune ligne.


Mec, chaque fois que je veux exécuter cette requête, j'ai cette erreur: imgur.com/a/1qgoJnD ou celui-ci: imgur.com/a/E8n7nAQ


L'ORA-00933 est une erreur de formatage. Il semble que vous utilisiez Toad, donc tout ce que vous avez sur les lignes 1 à 4 de cette capture d'écran est probablement à l'origine de cette erreur. En guise de note, c'est toujours une bonne idée de terminer vos déclarations par un point virgule (;). La deuxième capture d'écran avec l'erreur ORA-06550 peut signifier plusieurs choses: 1. Vous ne disposez pas des autorisations nécessaires pour exécuter le package DBMS_MONITOR. Vous devez avoir le privilège DBA ou avoir "exécuter sur sys.dbms_monitor" qui vous est explicitement accordé. Ou 2. Le package DBMS_MONITOR a été supprimé / jamais installé sur la base de données.


Vous devrez contacter un DBA / administrateur pour obtenir cette autorisation. Si vous êtes l'administrateur, connectez-vous simplement avec un schéma disposant du privilège DBA et vous devriez pouvoir exécuter cette instruction. Pour confirmer que le package existe, ouvrez le navigateur de schémas dans Toad, sélectionnez "SYS" dans la liste des schémas et sélectionnez "Packages" dans la liste d'objets. Vous devriez voir le package DBMS_MONITOR avec un certain nombre d'autres packages sys qui existent dans la base de données.


je n'ai pas pu trouver de package DBMS_MONITOR .. peut-être que je n'ai pas les autorisations nécessaires pour le voir ou qu'il n'a jamais été installé :(


Pouvez-vous voir l'un des packages SGBD *? Il y en a des centaines, donc si vous ne pouvez en voir aucun, il est probablement prudent de supposer que vous n'avez pas reçu les autorisations nécessaires. Pour être sûr à 100%, contactez un DBA ou un administrateur pour obtenir de l'aide.


Je peux voir de nombreux paquets mais pas celui que vous avez mentionné: / Okay, je vais faire ça!



0
votes

Les SQL exécutés depuis le frontend EBS sont généralement trop rapides pour être vus dans v $ session. Si un SQL est plus lent qu'une seconde (ou si le timing de l'instantané est correct), vous le verriez dans v $ active_session_history, qui capture un instantané de toutes les sessions actives chaque seconde.

À la place, vous devriez regarder v $ sqlarea, ce qui peut être fait par SQL, via Toad en utilisant l'option de menu Database-> Monitor-> SGA Trace / Optimization ou par notre Blitz Report https://www.enginatics.com/reports/dba-sga-sql-performance-summary/ .

Cependant, ces données contiennent des informations sur le module (c'est-à-dire quelle page OAF, formulaire, simultané, etc.) et le niveau de responsabilité (colonne d'action) uniquement et ne contiennent pas d'informations sur la session ou l'application.

La clé unique est sql_id et plan_hash_value, ce qui signifie que pour les SQL exécutés par différents modules et de différentes responsabilités, seul le module qui l'exécute en premier sera affiché.

Si vous triez les données par last_active_time et filtrez pour le module en question, c'est presque aussi bon qu'une trace. Les valeurs de liaison utilisées peuvent être récupérées à partir de v $ sql_bind_capture, ce que fait également le rapport Blitz ci-dessus.


3 commentaires

Ça a l'air intéressant! J'ai exécuté cette requête: SELECT * FROM v $ active_session_history et il y a une colonne appelée sql_id et une autre appelée sql_plan_hash_value. Je ne comprends pas comment pourrais-je obtenir toutes les requêtes / tables qui ont été invoquées dans l'application.


Je ne comprends pas cette partie: "L'endroit où vous devriez plutôt regarder est v $ sqlarea" que dois-je faire?


Comme v $ active_session_history ne suit pas nécessairement tous les SQL (ils peuvent manquer s'ils sont plus courts qu'une seconde), vous pouvez les trouver dans v $ sqlarea à la place - au moins directement après leur exécution / avant qu'ils ne soient dépassés. Utilisez la requête de rapport Blitz ci-dessus pour obtenir des informations supplémentaires sur le module EBS et la responsabilité. Dans v $ sqlarea cependant, les informations ne peuvent plus être liées à des sessions individuelles ou à des utilisateurs EBS.