获取Sybase中表的索引列表

时间:2018-07-24 02:04:31

标签: z-index sybase

This链接包含问题的答案,但尚未完成。

Sybase DBMS具有目录和架构的概念。因此,如何编写查询以检索目录内部架构中表的索引列表?

[编辑]

请考虑以下情形:

USE test
GO
CREATE TABLE dbo.test_table(<field_list>)
GO
CREATE TABLE foo.test_table(<field_list>)
GO
CREATE INDEX test_index ON test_table(<index_field_list>)
GO

您将看到创建了2个test_table表:一个在名为dbo的架构中,一个在名为foo的架构中。所以现在我的问题是-如何编写一个查询,以正确检查架构foo中表test_table上索引的存在?因为我引用的链接无法区分这两个表,因此在这种情况下将失败。我非常喜欢过滤模式和表名,而不是使用schemaName.tableName格式。我希望你有个主意。如果没有,请告诉我,我将尝试进一步解释。

[/ EDIT]

1 个答案:

答案 0 :(得分:0)

如果您以用户test的身份登录foo数据库,则create index表将应用foo.test_table命令(优先级将赋予您拥有的对象)。

如果您以test以外的其他人身份登录foo数据库,并假设您具有创建索引的权限,则create index命令将对{{ 1}}表(如果您不拥有给定名称没有提供显式所有者的对象,则dbo.test_table优先于对象所有者)。

如果您知道将有多个具有相同名称但所有者不同的表,则习惯提供显式所有者名称的习惯会更“干净”(而且您发出命令的可能性较小)对照“错误”表)。


关于如何检查索引是否存在……简而言之:

  • dbo包含数据库用户名和ID(名称,uid)
  • sysusers包含对象名称,对象类型,对象ID和所有者ID(名称,类型,ID,UID)
  • sysobjects包含索引名称,对象ID,索引ID和构成索引的列的非规范化列表(名称,ID,Indid,keys / keys2
  • sysindexes包含表/进程/视图的列名称,对象ID,列ID(名称,ID,colid)

示例联接(使用旧式联接子句):

syscolumns

select .... from sysusers u, sysobjects o, sysindexes i where u.name = '<user_name>' and o.name = '<table_name>' and o.type = 'T' -- T=table, P=procedure, V=view and i.name = '<index_name>' and o.uid = u.uid and o.id = i.id sysindexes.keys1/keys2的连接有点复杂,因为您需要弄清楚如何解析syscolumns.colid列以获得单个keys1/keys2值。< / p>

再次,我建议您看一下syscolumns.colid存储proc的代码,因为它引用了所有适当的系统(aka目录)表,并包括必要的连接子句的示例:

sp_helpindex