【问题标题】:Get index list for a table in Sybase获取 Sybase 中表的索引列表
【发布时间】:2019-07-01 09:21:37
【问题描述】:

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 格式。我希望你有一个想法。如果不是,请告诉我,我会尝试更详细地解释。

[/编辑]

【问题讨论】:

  • 请解释一下不完整的地方?另一个问题是关于 Sybase/SAP Adaptive Server Enterprise (ASE)。也许您想询问有关 Sybase/SAP SQL Anywhere 的信息?在 ASE 中,没有目录之类的东西。有数据库,然后是所有者(模式)和对象名称。
  • 哪种 Sybase (RDBMS) 产品(ASE?SQLAnywhere?IQ?Advantage?)?如果您使用的是 ASE,请查看sp_helpindex 存储过程的源代码,用于在sysobjects(表)、syspartitions(表/索引分区)、sysindexes(索引)和@987654328 之间进行连接@(构成索引的列)。其他数据库将具有类似的系统(也称为目录)表,用于获取有关索引的信息。
  • @AdamLeszczyński,我想为特定目录(数据库)内的某个特定用户(在特定架构内)拥有的表拥有所有索引?我确实谈到了 ASE。概念就在那里——只是名称不同。即,目录 = 数据库和架构 = 所有者。
  • @AdamLeszczyński,除非我不能在一个数据库中创建这样的表:USE foo &amp;&amp; CREATE TABLE dbo.test(...) &amp;&amp; CREATE TABLE bar.test(...)?或者我可以吗?因为如果可以的话,那两张表可以有完全不同的索引集。甚至更好 - 使用sa 用户连接到一个数据库,在同一服务器中使用sa 用户连接到另一个数据库,并查询表bar 以获取索引。这就是为什么我要过滤目录和架构的查询。
  • @markp,看我上面的回复

标签: z-index sybase


【解决方案1】:

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

如果您以foo 以外的任何人身份登录test 数据库,并假设您有权创建索引,则create index 命令将应用于dbo.test_table 表(优先级为dbo 的对象所有者,如果您不拥有给定名称的对象并且您没有提供明确的所有者)。

如果您知道您将拥有多个名称相同但所有者不同的表,那么养成提供明确所有者名称的习惯会更“干净”(并且您不太可能发出命令反对'错误'表)。


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

  • sysusers 包含 db 用户名和 ids (name, uid)
  • sysobjects 包含对象名称、对象类型、对象 ID 和所有者 ID(名称、类型、id、uid)
  • sysindexes 包含索引名称、对象 ID、索引 ID 和组成索引的非规范化列列表(名称、ID、indid、keys1/keys2)
  • syscolumns 包含表/进程/视图的列名、对象 id、列 id(名称、id、colid)

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

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/keys2syscolumns.colid 的连接有点复杂,因为您需要弄清楚您希望如何解析keys1/keys2 列以获得单独的syscolumns.colid 值。

再次,我建议您查看 sp_helpindex 存储过程的代码,因为它引用了所有适当的系统(又名目录)表并包含必要连接子句的示例:

exec sybsystemprocs..sp_helptext sp_helpindex,null,null,'showsql'
go

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2011-08-21
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多