0

我正在使用一个遗留系统,该系统尝试通过首先以该用户的身份查询 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 使用连接时,我没有得到任何记录。什么会限制我对纯粹基于联接的记录的访问?索引权限??我很困惑。

4

1 回答 1

0

对于用户映射中的特定用户,检查您是否选中了除 db_denydatareader 和 db_denydatawriter 之外的所有复选框。

还要检查这个
对象'sysobjects',数据库'mssqlsystemresource',模式'sys'的SELECT权限被拒绝
http://social.msdn.microsoft.com/Forums/en/sqlsecurity/thread/a2befd20-2a9b-4a60- 95a9-3a80a1a99ea1

于 2013-01-08T15:25:54.287 回答