我有以下查询来检查我的 SQL 数据库中是否有任何用户定义的对象。
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,并且至少选择了一行。
我不想将用户添加为系统管理员。我应该授予的最低角色/权限是什么,以便从 dbo.sysobjects 中选择返回内容。
谢谢
最佳答案
首先 - 您应该使用 sys.objects 而不是 dbo.sysobjects。 dbo.sysobjects 是 SQL 2000 构造,出于向后兼容性原因,它仅在 SQL 2008 中存在。 sys.objects 为在数据库中创建的每个用户定义的、架构范围的对象包含一行,因此您根本不必过滤您的查询。 sys.all_objects 是一个超集,包含系统和用户对象。
其次 - 在权限方面 - 在 SQL Server 2005 和更高版本中,目录 View 中元数据的可见性仅限于用户拥有或用户已被授予某些权限的安全对象。因此,您的用户必须获得对其正在查找的项目的某些权限。在数据库中的模式上向用户授予 VIEW DEFINITION 将允许查询工作,而无需授予对任何数据的访问权限。
关于sql-server-2008 - 查询 dbo.sysobjects 的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8356287/