【问题标题】:SQL User Cannot Select Objects from sysobjects where UID = UserSQL 用户无法从 UID = 用户的 sysobjects 中选择对象
【发布时间】:2012-12-22 10:56:41
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server permissions sysobjects


    【解决方案1】:

    对于用户映射中的特定用户,检查您是否选中了除 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

    【讨论】:

    • 您好,感谢您的回复。没有检查工作用户或损坏用户的角色。此外,用户可以查询 sysobjects,它只返回 dbo 对象,不返回它自己的 UID 的对象。
    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 2021-09-22
    • 2021-07-02
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多