反思DEFAULT值和计算列

Raf*_*ver 4 sql sybase-ase

对于为DBIx :: Class(:: Schema :: Loader)转储Sybase模式的Perl库,我需要能够内省DEFAULT和计算列.

假设我们有:

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

就我而言:

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 
Run Code Online (Sandbox Code Playgroud)

这告诉我列'foo'有一个id为602182610的存储过程,它返回值.如何从此ID中获取原始DEFAULT'foo'?

timestamp列没有计算列对象,也没有默认的sproc,但我不知何故需要知道它实际上是一个时间戳列.查看DBI返回的数据类型告诉我它是'varbinary',即时间戳的内部表示.我怎么知道它是否是一个?

它还告诉我列'adt'是一个计算列,该列的对象具有id 618182667.

在sysobjects中查找该id告诉我一些看起来很有用,除了:

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

name                           type 
------------------------------ ---- 
bar_adt_6181826                C    
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

Raf*_*ver 6

这是我最终使用的查询,以防有人感兴趣:

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'
Run Code Online (Sandbox Code Playgroud)

似乎工作得很好,虽然我仍然需要编写更多的数据类型测试:)