SQL用户无法从其中UID = User的sysobjects中选择对象

时间:2013-01-08 14:48:22

标签: sql sql-server permissions sysobjects

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

1 个答案:

答案 0 :(得分:0)

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

也检查一下
The SELECT permission was denied on the object 'sysobjects', database 'mssqlsystemresource', schema 'sys'
http://social.msdn.microsoft.com/Forums/en/sqlsecurity/thread/a2befd20-2a9b-4a60-95a9-3a80a1a99ea1