Sybase {ASE}是否使用" schema.table"或只是"表"

时间:2017-08-09 16:11:00

标签: sybase sybase-ase

ALL,

标题几乎说明了一切。我正在寻找here,但无法找到有关架构的任何信息。

有人可以请一些光吗?

我知道MS SQL Server使用" schema.name"引用数据库中的表,但对于Sybase,我不确定。

TIA!

编辑:

我想我应该更具体一点。

我知道在MS SQL Server中可以修改表所有者,但你仍然可以选择" SELECT su.name FROM sysobjects so sysusers su,sys.tables t,sys.schemas s WHERE so.uid = su.uid AND t.object_id = so.id AND t.schema_id = s.schema_id AND s.name =?和so.name =?;"

现在随着Sybase到处都是我查询查询表所有者不引用模式名称只有表名。这是否意味着表所有者在Sybase中不可更改?或者它是可更改的,但架构也会被更改?

有人可以解决一些问题吗?

2 个答案:

答案 0 :(得分:1)

在Sybase / SAP ASE中,所有表都拥有所有者;这个所有者实际上与模式相同。

您提到的链接指向 sysobjects (系统)表,该表存在于每个数据库中。 sysobjects 包含数据库中所有对象(例如,表,过程,触发器,视图等)的一些高级元数据。

sysobjects

中感兴趣的两列
  • name :对象的名称(例如,表名,proc的名称)
  • uid :对象所有者的数据库用户ID

所有系统表在 sysobjects 中都有一个条目 uid = 1 ,它引用数据库所有者(即 user_name(1)= dbo )。

在大多数环境中,数据库所有者( dbo )通常也拥有数据库中的大多数其他对象(即,大多数 sysobjects 行具有 uid = 1 )。

如果某个对象由dbo以外的其他人拥有,则 sysobjects 行将具有uid = user_id('non_dbo_owner_name');例如,如果bob的数据库用户ID(uid)为47,那么bob拥有的任何对象都将具有 sysobjects.uid = 47

当您引用没有所有者/模式名称的表(例如,select * from tab1)时,ASE将首先查找您拥有的对象(即,您是否拥有名为“tab1”的表),如果它找不到这样的表然后它查找dbo拥有的表(即'dbo.tab1'存在吗?)。

当您引用附加了所有者/模式名称的表时,ASE将只查找该表的存在。

如果您没有名为“tab1”的表,则以下内容是等效的:

  • 从tab1
  • 中选择*
  • 从dbo.tab1
  • 中选择*

回应更新的问题:

Sybase / SAP ASE不支持更改对象的所有者。

至于查找表的所有者/架构,你有几个选择:

select u.name as 'owner_name', 
       o.name as 'table_name'
from   sysobjects o,
       sysusers u
where  o.uid  = u.uid
and    o.name = '<name_of_table>'
and    o.type = 'U'

-- or

select user_name(o.uid) as 'owner_name', 
       o.name as 'table_name'
from   sysobjects o
where  o.name = '<name_of_table>'
and    o.type = 'U'

答案 1 :(得分:0)

它的工作方式与MS SQL Server相同。您可以使用schema.object。 如果您使用object,则会搜索该对象:

  • 首先在我们的架构中
  • 然后在dbo架构

当您连接外部ASE服务器时,如果所有者为database.owner.object或事件database..object表示法,您还可以使用dbo表示法或server.database.owner.object表示法。