Introspection des valeurs et des colonnes calculées DÉFAUT
-
24-09-2019 - |
Question
Pour une bibliothèque Perl qui déverse des schémas Sybase pour DBIx :: Class (:: schéma de Loader), je dois pouvoir introspect colonnes calculées et les paramètres par défaut.
Supposons que nous ayons:
create table bar (
id INTEGER IDENTITY PRIMARY KEY,
foo VARCHAR(10) DEFAULT 'foo',
adt AS getdate(),
ts timestamp
)
Voici aussi loin que je suis:
select substring(c.name,1,5) name, c.cdefault, c.computedcol from syscolumns c
join sysobjects o on c.id = o.id where o.name = 'bar' and o.type = 'U'
name cdefault computedcol
---------- ----------- -----------
id 0 NULL
foo 602182610 NULL
adt 0 618182667
ts 0 NULL
Cela me dit que la colonne « foo » a une procédure stockée avec ID 602182610 qui retourne la valeur. Comment puis-je obtenir le DEFAULT original 'foo' de cet ID?
La colonne d'horodatage ne sont pas calculées objet de colonne ni sproc par défaut, mais je dois en quelque sorte de savoir qu'il est en fait une colonne d'horodatage. En regardant le type de données retourné par DBI car il me dit qu'il est « varbinary », la représentation interne d'un horodatage. Comment puis-je savoir si elle est ou pas?
Il me dit aussi que la colonne « HAA » est une colonne calculée, l'objet de cette colonne ayant id 618.182.667.
Recherche sysobjects pour cette id me dit peu qui semble utile, sauf:
select substring(name,1,15) name, type from sysobjects where id = 618182667
name type
------------------------------ ----
bar_adt_6181826 C
Toute aide très appréciée.
La solution
En ce qui concerne votre première question, sur les valeurs par défaut
select text from syscomments
where id = 602182610
Comme pour les colonnes d'horodatage, la colonne type
dans syscolumns références systypes.type
. Dans ce tableau, la colonne de name
contient le nom de type de données.
Autres conseils
Ceci est la requête que je fini par utiliser au cas où quelqu'un se intéresse:
SELECT c.name name, t.name type, cm.text deflt
FROM syscolumns c
JOIN sysobjects o ON c.id = o.id
LEFT JOIN systypes t ON c.type = t.type AND c.usertype = t.usertype
LEFT JOIN syscomments cm
ON cm.id = CASE WHEN c.cdefault = 0 THEN c.computedcol ELSE c.cdefault END
WHERE o.name = 'table_name' AND o.type = 'U'
Il semble bien fonctionner, même si je dois encore écrire quelques autres tests de type de données:)