我有以下查询来检查我的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.这意味着if exists调用返回空行。
但是,如果我将用户添加为sysadmin,那么我将testFormEmpty值设为0,并且至少选择了一行。
我不想将用户添加为sysadmin。我应该授予的最小角色/权限是什么,以便从dbo.sysobjects中选择返回内容。
由于
答案 0 :(得分:8)
首先 - 您应该使用sys.objects而不是dbo.sysobjects。 dbo.sysobjects是SQL 2000构造,仅出于向后兼容性原因,仅在SQL 2008中。 sys.objects包含在数据库中创建的每个用户定义的模式范围对象的行,因此您根本不必过滤查询。 sys.all_objects是一个超集,包含系统和用户对象。
第二 - 在权限方面 - 在SQL Server 2005及更高版本中,目录视图中元数据的可见性仅限于用户拥有或用户被授予某些权限的安全性。因此,您的用户必须获得对其正在寻找的项目的一些许可。在数据库中的模式上向用户授予VIEW DEFINITION将允许查询工作,而不授予对任何数据的访问权。