我正在使用一个遗留系统,该系统尝试通过首先以该用户的身份查询 sysobjects 以确定对象是否存在来为特定用户执行 SQL 中的架构更改。如果是,它会创建一个 ALTER VIEW 语句,否则它会创建一个 CREATE VIEW 语句。在这种情况下,视图存在,但查询仍然无法列出对象。
例如:
setuser 'APPLICATION_DEV'
Select * from sysobjects o, sysusers u
where u.uid = o.uid
and u.name = N'APPLICATION_DEV'
问题是该数据库中的某些帐户可以无错误地运行此查询,并且它返回该用户拥有的所有对象。但是,其他帐户没有得到此查询返回的记录。如果我将用户设置为 SA 并运行查询,则会出现所有用户对象。受影响的用户是架构的所有者,并且拥有架构的创建视图权限。我找不到工作用户和非工作用户帐户之间的权限差异。
是否有我缺少的权限会限制用户在 sysobjects 中查询他们自己的对象?
是的,我知道 sysobjects 已经过时,但我无法控制这里的实际代码,而是必须修复数据库,以便他们的代码能够按预期工作。
编辑:其他发现。为了使事情复杂化,我可以成功运行它:
setuser 'APPLICATION_DEV'
Select * from sysusers
Where name = 'APPLICATION_DEV'
我也可以成功执行:
setuser 'APPLICATION_DEV'
Select * from sysobjects
Where uid = 308 --308 is the uid of the APPLICATION_DEV user
但是,当我在 where 子句或通过 INNER JOIN 使用连接时,我没有得到任何记录。什么会限制我对纯粹基于联接的记录的访问?索引权限??我很困惑。