sql-server-2008 - 查询 dbo.sysobjects 的权限

标签 sql-server-2008

我有以下查询来检查我的 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/

相关文章:

sql - 在 sql server 中将 12 小时格式转换为 24 小时格式

sql-server - 用于 SQL Server 中 OR 语句的最佳索引

linq-to-sql - Linq to SQL 或 Linq to Entities 4.0 是否支持hierarchyid 数据类型

asp.net - SQL Server Asp.Net - "Login failed"

asp.net - 本地主机上的 SQL Server 2008 : Connection continually refused

sql-server - 我应该将哪个连接字符串与 MS SQL 中的应用程序角色一起使用?

c# - 如何突出显示 gridview 中的单词

sql-server-2008 - SQL Server 在存储过程中使用 EXEC/sp_executesql 还是只是普通的 sql?

sql - 根据列值的条件 ORDER BY

sql - 对 SQL Server Profiler(或其他观察者)隐藏语句