我使用以下查询来检查我的SQL DB中是否有用户定义的对象。
DECLARE @testForEmpty BIT
if exists
(select top 1 null from dbo.sysobjects where (objectproperty(id, 'IsMsShipped') = 0))
set @testForEmpty = 0
else set @testForEmpty = 1当我以特定用户的身份运行这个查询时,我总是得到testForEmpty = 1。这意味着如果exists调用返回空行。
但是,如果我将用户添加为sysadmin,那么我得到的testFormEmpty值为0,并且至少有一行被选中。
我不想将用户添加为sysadmin。为了使select from dbo.sysobjects返回内容,我应该授予的最低角色/权限是多少。
谢谢
发布于 2011-12-03 02:07:17
首先,你应该使用sys.objects而不是dbo.sysobjects。dbo.sysobjects是一个SQL2000构造,由于向后兼容性的原因,它只存在于SQL2008中。对于在数据库中创建的每个用户定义的、模式作用域的对象,sys.objects都包含一行,因此您根本不必过滤查询。sys.all_objects是一个超集,它同时包含系统对象和用户对象。
其次-在权限方面-在SQL Server 2005和更高版本中,目录视图中元数据的可见性仅限于用户拥有或已被授予某些权限的安全对象。因此,您的用户必须被授予对其正在查找的项目的某些权限。向用户授予对数据库中架构的视图定义将允许查询工作,而不会授予对任何数据的访问权限。
https://stackoverflow.com/questions/8356287
复制相似问题