Pergunta

Para uma biblioteca Perl que despeja esquemas de sybase para dbix :: classe (:: schema :: carregador), preciso ser capaz de introspectar padrões e colunas computadas.

Suponha que temos:

create table bar (
  id INTEGER IDENTITY PRIMARY KEY,
  foo VARCHAR(10) DEFAULT 'foo',
  adt AS getdate(),
  ts timestamp
)

Aqui está o mais longe possível:

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 

Isso me diz que a coluna 'Foo' possui um procedimento armazenado com ID 602182610 que retorna o valor. Como faço para obter o padrão 'foo' original deste ID?

A coluna Timestamp não possui objeto de coluna calculado nem um sproc padrão, mas de alguma forma preciso saber que é de fato uma coluna de data e hora. Olhando para o tipo de dados retornado pelo DBI, pois ele me diz que é 'varbinário', a representação interna de um registro de data e hora. Como sei se é ou não?

Ele também me diz que a coluna 'ADT' é uma coluna computada, o objeto para esta coluna com ID 618182667.

Olhando em sysobjects para esse id me diz pouco que parece útil, exceto:

select substring(name,1,15) name, type from sysobjects where id = 618182667

name                           type 
------------------------------ ---- 
bar_adt_6181826                C    

Qualquer ajuda muito apreciada.

Foi útil?

Solução

Em relação à sua primeira pergunta, sobre os padrões

select text from syscomments 
where id = 602182610

Quanto às colunas de timestamp, o type coluna em referências de syscolumns systypes.type. Naquela mesa name A coluna contém o nome do tipo de dados.

Outras dicas

Esta é a consulta que acabei usando, caso alguém esteja interessado:

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 funcionar bem, embora eu ainda precise escrever mais alguns testes do tipo de dados :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top