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]
答案 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