Introspección de valores por defecto y columnas calculadas
-
24-09-2019 - |
Pregunta
Para una biblioteca Perl que vuelca esquemas de Sybase para DBIx :: Clase (Esquema :: :: Loader), tengo que ser capaz de valores predeterminados Introspect y columnas calculadas.
Supongamos que tenemos:
create table bar (
id INTEGER IDENTITY PRIMARY KEY,
foo VARCHAR(10) DEFAULT 'foo',
adt AS getdate(),
ts timestamp
)
Aquí está la medida de lo que tengo:
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
Esto me dice que la columna 'foo' tiene un procedimiento almacenado con id 602182610 que devuelve el valor. ¿Cómo consigo el original por defecto 'foo' de esta identificación?
La columna de marca de tiempo hace objeto no haber calculado la columna ni un procedimiento almacenado por defecto, pero de alguna manera necesito saber que es, de hecho, una columna de marca de tiempo. Mirando el tipo de datos devuelto por DBI para que me dice que es 'varbinary', la representación interna de una marca de tiempo. ¿Cómo sé si es o no es una?
También me dice que la columna 'ADT' es una columna calculada, el objeto de esta columna que tiene ID 618182667.
Mirándome a sysobjects para ese id dice poco que parece útil, excepto:
select substring(name,1,15) name, type from sysobjects where id = 618182667
name type
------------------------------ ----
bar_adt_6181826 C
Cualquier ayuda muy apreciada.
Solución
En cuanto a su primera pregunta, sobre los valores predeterminados
select text from syscomments
where id = 602182610
En cuanto a la indicación de la hora columnas, la columna de la type
en syscolumns referencias systypes.type
. En ese columna de la tabla contiene el nombre name
tipo de datos.
Otros consejos
Esta es la consulta que terminé usando por si alguien está interesado:
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'
Parece que funciona bien, aunque todavía tengo que escribir más ensayos de tipo de datos:)