【问题标题】:The server principal "XYuser" is not able to access the database "Ydb" under the current security context服务器主体“XYuser”无法在当前安全上下文下访问数据库“Ydb”
【发布时间】:2010-10-07 03:45:20
【问题描述】:

系统规格

Microsoft SQL Server Management Studio          9.00.4035.00  
Microsoft Analysis Services Client Tools        2005.090.4035.00  
Microsoft Data Access Components (MDAC)         2000.085.1132.00  
                                                 (xpsp.080413-0852)  
Microsoft MSXML                                 2.6 3.0 4.0 5.0 6.0 
Microsoft Internet Explorer                     7.0.5730.13  
Microsoft .NET Framework                        2.0.50727.1433  
Operating System                                5.1.2600  

在名为 BHAVMSQL02 的 SQL Server 2005 上,我有两个数据库 Mattercentre_devCMSNET_DEVMattercentre_dev 有一个存储过程,它从 CMSNET_DEV 中的表构建一个列表。存储过程看起来 像这样……

USE [Mattercentre_dev]
GO
/****** Object:  StoredProcedure [dbo].[UDSPRBHPRIMBUSTYPE]   
  Script Date:02/12/2009 10:18:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO


ALTER PROCEDURE [dbo].[UDSPRBHPRIMBUSTYPE] WITH EXECUTE AS 'Readuser' AS

DECLARE @SERVERNAME nvarchar(30)
DECLARE @DBASE nvarchar(30)
DECLARE @SQL nvarchar(2000)
SET @SERVERNAME = Convert(nvarchar,
  (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSSERVER'))
SET @DBASE = Convert(nvarchar,
  (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSDBNAME'))

SET @SQL = 
'SELECT 
    null as Code
    , ''(not specified)'' as Description  
UNION SELECT 
    clnt_cat_code as Code
    , clnt_cat_desc as Description   
FROM '
    + @SERVERNAME + '.' + @DBASE + '.dbo.hbl_clnt_cat  
WHERE 
    inactive = ''N''  
ORDER BY Description'
PRINT @SQL

EXECUTE sp_executeSQL @SQL

@SERVERNAME == 'BHAVMSQL02'

@DBASE      == 'CMSNET_DEV'

执行存储过程时出现以下错误信息...

The server principal "ReadUser" is not able to access the database "CMSNET_DEV" under the current security context.

在谷歌搜索错误消息后,我进行了以下修复...

  • 已删除用户 ReadUser BHAVMSQL02 -> 数据库 -> Mattercentre_dev -> 安全 -> 用户
  • 从 BHAVMSQL02 设置 ReadUser -> 安全性-> 使用以下内容登录 设置...

    一般
    登录名 - readUser
    密码 - xxxxxxxxxxxx
    确认 - xxxxxxxxxxxx
    默认数据库 - 主
    默认 lg - 英式英语
    其他一切 - 未设置

    服务器角色 仅公开集

    用户映射 CMSNET_DEV - ReadUser - dbo
    数据库角色成员 - db_owner, public

    Mattercentre_dev - ReadUser - dbo
    数据库角色成员 - db_owner, public

然后我运行以下脚本...

ALTER DATABASE CMSNET_DEV SET TRUSTWORTHY ON
GO
ALTER DATABASE mattercentre_dev SET TRUSTWORTHY ON
GO

我重新运行存储过程并再次执行它,我仍然有相同的 错误信息。

我在 Stack Overflow 和建议的解决方案中查找了这个问题 和我的差不多。

【问题讨论】:

    标签: sql sql-server sql-server-2005 ssms


    【解决方案1】:

    当您的存储过程包含动态 SQL 时,您不能使用所有权链接,即这样做会破坏所有权链。

    为了使其工作,您需要使用证书来签署您的存储过程。

    下面是一篇精彩的文章,其中包含对存储过程进行签名的说明。

    http://www.sommarskog.se/grantperm.html

    更详细地看一下,您使用“execute as 子句”这一事实应该否定所有权链因合并动态 SQL 而中断的事实。

    考虑到这一点,可能的原因是登录名“ReadUser”没有对相关数据库的适当读取访问权限,但鉴于登录名是两个数据库中的 db_owner 角色。也就是说,如果数据库角色已从其原始状态更改,那么这可能不成立。

    为了测试问题是否与“ReadUser”登录名无关,我建议创建一个新的 SQL Server 登录名,并将登录名映射到具有适当读取权限的两个数据库(通过创建同名的数据库登录名)。然后修改存储过程,作为新的登录名执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2018-03-29
      相关资源
      最近更新 更多