Introspezione valori standard e colonne calcolate
-
24-09-2019 - |
Domanda
Per una libreria Perl che discariche schemi Sybase per DBIx :: Class (:: :: Schema Loader), ho bisogno di essere in grado di impostazioni predefinite introspezione e colonne calcolate.
Supponiamo di avere:
create table bar (
id INTEGER IDENTITY PRIMARY KEY,
foo VARCHAR(10) DEFAULT 'foo',
adt AS getdate(),
ts timestamp
)
Ecco quanto ho ottenuto:
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
Questo mi dice che la colonna 'pippo' ha una stored procedure con id 602.182.610 che restituisce il valore. Come faccio ad avere il predefinito originale 'foo' da questo id?
La colonna timestamp fa oggetto non hanno calcolato colonna, né una sproc default, ma in qualche modo ho bisogno di sapere che è in effetti una colonna timestamp. Guardando il tipo di dati restituito da DBI per esso mi dice che si tratta di 'varbinary', la rappresentazione interna di un timestamp. Come faccio a sapere se è o non è uno?
Mi dice anche che la colonna 'ADT' è una colonna calcolata, l'oggetto di questa colonna avere id 618.182.667.
mi Guardando in sysobjects per questo id dice poco che sembra utile, tranne:
select substring(name,1,15) name, type from sysobjects where id = 618182667
name type
------------------------------ ----
bar_adt_6181826 C
Qualsiasi aiuto molto apprezzato.
Soluzione
Per quanto riguarda la prima domanda, su valori di default
select text from syscomments
where id = 602182610
Per quanto riguarda le colonne timestamp, la colonna type
in syscolumns riferimenti systypes.type
. In quella colonna della tabella name
contiene il nome tipo di dati.
Altri suggerimenti
Questa è la query ho finito per usare nel caso in cui qualcuno è interessato:
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'
sembra funzionare bene, anche se ho ancora bisogno di scrivere alcuni più test di tipi di dati:)