0

我们开始从 SQL Server 2000 升级到 SQL Server 2008,然后是 SQL Server 2012(我们不能直接从 2000 升级到 2012)。

SQL Server 2000 中的存储过程之一将给定值所在的视图中的值设置@ErrorMsg为名称列。出于这些目的,假设我正在寻找视图中确实存在的名称。sys.objectsnamezz_BICWS_PersonInfo_Search_1000000000000000000sys.objects

该过程在 SQL Server 2000 中有效,如果我在 SQL Server 2012 中运行以下代码,它将返回正确的名称,但在 SQL Server 2012 中的存储过程中不会。

declare @ErrorMsg varchar(1000)

set @ErrorMsg = 'xxxxxxx'

select @ErrorMsg = name
    from bic.dbo.sysobjects 
    Where name = 'zz_BICWS_PersonInfo_Search_10000000000000000000'

print 'test ' + @ErrorMsg

这些相同的行存在于存储过程中,除了打印行,@ErrorMsg输出到调用该过程的应用程序。但它xxxxxx使用应用程序中的消息框返回初始值以显示返回值。

但是,如果我将 where 子句更改为

Where name Like ‘zz_BICWS_PersonInfo_Search_%’  

(大约有 40 行与此匹配)然后我将获得找到的第一行的名称。

4

2 回答 2

1

感谢另一个论坛,我收到了答案。我在这里为可能遇到相同问题的其他人发布它。

SQL 2000 和更高版本之间有一个重要的区别。在 SQL 2000 中,每个人都可以看到所有元数据,并且无法更改它。

在 SQL 2005 及更高版本中,只有在您有权限的情况下才能查看元数据。当您的 SELECT 语句由您的应用程序中的普通用户执行时,它不会命中任何行。但是,当您在以 sa 连接的 SSMS 中运行 SELECT 或至少使用 db_owner 权限时,一切正常。

如果您依赖可见的元数据,则需要将权限 VIEW DEFINITION 授予适当的用户。

将视图定义授予应用程序用户

将数据库中所有对象的 VIEW DEFINITION 授予角色 appusers。此语句授予对 dbo 模式中所有对象的权限:

将 SCHEMA::dbo 上的视图定义授予 appusers

如果您对对象具有 SELECT 或 EXECUTE 权限,则该对象隐含 VIEW DEFINITION 权限。

于 2012-08-09T13:04:29.477 回答
0

我在其中找到问题时遇到了一些麻烦,但我认为问题在于您试图将 40 行塞入一个变量中。

尝试删除 @ErrorMsg 变量,然后运行它:

select name
from bic.dbo.sysobjects 
Where name = 'zz_BICWS_PersonInfo_Search_10000000000000000000'
于 2012-08-07T20:51:17.677 回答