Accueil > ASE, SGBDR > [Sybase] Quelques tables systèmes

[Sybase] Quelques tables systèmes

Dans Sybase, comme dans Oracle ou SQLServer, il y a des tables systèmes.
Autant ce n’est pas une bonne idée de les modifier, autant il peut être utile de les connaître et de les interroger.
Du coup, dans ce billet, on va voir quelques tables systèmes, comment les lier et les utiliser (toujours en lecture).

La table centrale, pour une utilisation autre que DBA, est la table sysobjects.
Elle peut être utile à connaître dans le cadre de développements et encore plus dans le cadre d’une maintenance (du genre quand on connait pas toute l’application…).

La colonne « type » est la plus importante, à mon sens, les valeurs sont :

  • D : Default
  • P : Procédures
  • RI : Contraintes de référentiel
  • S : Tables système
  • SF : Fonctions
  • TR : Triggers
  • U : Tables (créées par l’utilisateur)
  • V : Vues
  • Dans le tas, j’avoue que je ne vois pas trop l’intérêt des types D et RI…(actuellement, c’est les tables qui ont été créées à l’occasion d’une modification structurelle, avec un nom du style ).

    Quoiqu’il en soit, si on fait un bête et méchant :

    SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name
    

    On obtient toutes les tables utilisateur.

    Peut-on aller plus loin ? Bien sûr ! (et encore heureux !)

     
    Comment voir la source d’une procédure, par exemple ?

    SELECT com.text AS TEXT 
    FROM dbo.sysobjects obj 
    INNER JOIN dbo.syscomments com 
        ON com.id = obj.id 
    INNER JOIN dbo.sysusers users ON users.uid = users.uid
    WHERE obj.name LIKE '<mon élément>' 
    AND obj.type = 'P'  -- facultatif
    AND users.name = 'dbo' 
    ORDER BY obj.name, com.colid
    

    Mais cela fonctionne également avec les triggers, par exemple.
    Il suffit de changer type = ‘P’ en type = ‘TR’ (‘V’ pour les vues…) et indiquer le nom du trigger à la place de .

    Pourquoi filtrer sur l’utilisateur ‘dbo’ ?
    Parce que l’élément va potentiellement exister pour chacun des utilisateurs qui peuvent le voir/exécuter.
    Dans mon cas, il y a une trentaine utilisateurs…

    Et ‘colid’ ? C’est simplement l’index du bloc, avec pour base 1.
    Pour une procédure, par exemple, le premier bloc contiendra à minima ‘CREATE PROC […]’.

    Pas toujours utile.
    Je préfère la recherche d’un texte :

    SELECT 
        obj.name AS 'PROC',
        com.text AS TEXT 
    FROM dbo.sysobjects obj 
    INNER JOIN dbo.syscomments com 
        ON com.id = obj.id 
    INNER JOIN dbo.sysusers users ON users.uid = users.uid
    WHERE obj.type = 'P' 
    AND lower(com.text) LIKE lower('%TODO%')
    AND users.name = 'dbo' 
    ORDER BY obj.name, com.colid
    

    (bon, le pire, c’est que cette requête me retourne des résultats😄 )
    Avec une requête de ce type, on va, par exemple, pouvoir chercher sur le nom d’une procédure, pour voir où elle est utilisée (certains logiciels le font, comme DBArtisan, mais…c’est pas toujours rapide).

    Allez, on attaque de suite une requête un peu plus complexe.

    SELECT 
        cols.name   as Column_name,
        types.name  as Type,
        cols.length as Length,
        cols.prec   as Prec,
        cols.scale  as Scale,
        CASE WHEN cols.status = 8 THEN 1
        ELSE 0 END  as Nulls,
        CASE WHEN cols.status = 128 THEN 1
        ELSE 0 END  as 'Identity'
    FROM sysobjects obj
    INNER JOIN syscolumns cols
        ON cols.id = obj.id
    INNER JOIN systypes types
        ON types.usertype = cols.usertype
    WHERE obj.type = 'S'
    AND obj.name = 'sysobjects'
    ORDER BY cols.colid
    

    Ça ressemble à un sp_help, non ? C’est le but.
    Le champ status est un peu particulier, il fait penser au enum flag

    • Bits 0–2 (valeur 1, 2, et 4) – indique si la colonne utilise un type binaire. Si la colonne utilise le type text/image, les bits 0 et 1 indique le statut de réplication :
      • 01 = toujours
      • 10 = si changement
      • 00 = jamais
    • Bit 3 ( valeur 8) – indique que la valeur peut être NULL.
    • Bit 4 ( valeur 16) – indique s’il existe plus de une contrainte pour cette colonne.
    • Bits 5 and 6 – utilisées en interne.
    • Bit 7 ( valeur 128) – indicates an identity column.

    D’autres petites choses utiles ?

    • sp_help : affiche un descriptif complet de l’élément passé en paramètre (table, procédure…).
    • sp_pkeys : affiche des informations sur les clefs d’une table.
    • sp_helpindex : affiche des informations sur les index d’une table.
    • sp_spaceused : affiche des informations concernant l’espace utilisé par une table.
    • sp_spaceused : utilisé sans paramètre, donne les informations concernant l’espace utilisé par la base de données courante (peut être un peu long).
    • sp_who [user] : permet d’avoir les utilisateurs connectés et ce qu’ils font, passer l’utilisateur en paramètre permet de filtrer dessus.
    • sp_displaylogin : permet d’obtenir des informations complètes sur l’utilisateur courante.
    • SELECT suser_name() : retourne l’utilisateur courant.
    • SELECT db_name() : retourne le nom de la base courante.

     
    Voilà, ce sont de petites choses, un début. Mais ça peut fournir des pistes utiles pour des requêtes plus complexes et plus utiles🙂

Catégories :ASE, SGBDR
  1. 22/06/2012 à 13:03

    C’est plutôt bon à savoir !
    Surtout au niveau des schémas SQL Server et lors de la création de procédures stockées (avec l’application des bonnes pratiques des conventions de nommage).

    • 22/06/2012 à 13:44

      Sybase, ici ^^
      Les deux sont en Transact-SQL, mais comme j’ai pas vérifié les différences/similitudes… (à moins que tu puisse m’éclairer sur le sujet 😀 )
      SQL Server, j’essaierais de faire, quand j’aurais / je prendrais du temps (si c’est différent; Oracle aussi, tiens, pour pas faire de jaloux !)

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :