Основной сервер «XYuser» не может получить доступ к базе данных «Ydb» в текущем контексте безопасности - PullRequest
2 голосов
/ 12 февраля 2009

Технические характеристики системы

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  

В SQL Server 2005 с именем BHAVMSQL02 у меня есть две базы данных Mattercentre_dev и CMSNET_DEV . Mattercentre_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 -> Безопасность -> Пользователи
  • Настройка ReadUser из BHAVMSQL02 -> Безопасность -> Вход со следующим Настройки ...

    Общее
    Имя пользователя - readUser
    Пароль - ххххххххххх
    Подтвердите - xxxxxxxxxxxx
    ДБ по умолчанию - мастер
    по умолчанию lg - британский английский
    Все остальное - Unset

    Роли сервера Единственный общедоступный набор

    Пользовательские сопоставления CMSNET_DEV - ReadUser - dbo
    Членство в роли базы данных - db_owner, общедоступный

    Mattercentre_dev - ReadUser - dbo
    Членство в роли базы данных - db_owner, общедоступный

Затем я запустил следующий скрипт ...

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

Я перезапустил хранимую процедуру и выполнил ее снова, и у меня все еще остается то же самое сообщение об ошибке.

Я посмотрел этот вопрос в Переполнении стека и предложенных решениях. похожи на мои.

1 Ответ

2 голосов
/ 12 февраля 2009

Вы не можете использовать цепочку владения, если ваша хранимая процедура содержит динамический SQL, т. Е. Это разрывает цепочку владения.

Чтобы это работало, вам нужно использовать сертификат для подписи ваших хранимых процедур.

Ниже приведена замечательная статья, в которой содержатся инструкции по подписанию хранимых процедур.

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

Если рассмотреть это более подробно, то, что вы используете «выполнить как предложение», должно свести на нет тот факт, что цепочка владения разорвана в результате включения динамического SQL.

Имея это в виду, вероятная уловка заключается в том, что по какой-то причине логин «ReadUser» не имеет соответствующего доступа для чтения к рассматриваемым базам данных, однако это не должно иметь место, учитывая, что логин является членом роль db_owner в обеих базах данных. Тем не менее, если роли базы данных были изменены по сравнению с их исходным состоянием, это может не соответствовать действительности.

Чтобы проверить, что проблема не изолирована от имени входа «ReadUser», я бы предложил создать новое имя входа SQL Server и сопоставить имя входа с обеими базами данных (там путем создания имен входа базы данных с тем же именем) с соответствующим доступом для чтения. Затем измените хранимую процедуру, чтобы она выполнялась как новый логин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...