2015-07-10 4 views
0

Я пытаюсь создать запрос, который обращается к нескольким базам данных на одном сервере. Я использую курсор для доступа к нескольким другим связанным серверам к базовому серверу, на котором выполняется запрос. Вопрос, который я бегу в следующее:Принцип работы сервера «Пользователь» не может получить доступ к db «Металлы» в текущем контексте безопасности

Msg 916, Level 14, State 1, Line 43 
The server principal "USER" is not able to access the database "Metals" under the current security context. 
Msg 3930, Level 16, State 1, Line 104 
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction. 
Msg 916, Level 14, State 1, Line 43 
The server principal "User" is not able to access the database "Metals" under the current security context. 
Msg 3930, Level 16, State 1, Line 104 
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction. 

Сервер показывает, что я вошел в систему, так почему база данных с помощью «USER» и «пользователь», чтобы попытаться получить доступ к «Металлы» дб?
Я считаю, что запрос на доступ к Metals db верен, потому что он возвращает правильные данные при запуске за пределами динамического кода sql. Я думаю, что проблема связана с разрешениями, но я не знаю, какие разрешения я должен изменить для пользователя. В настоящее время BLUser имеет подключение и выбор разрешений. Существуют ли другие разрешения, которые я должен добавить, чтобы они могли получить доступ к Metals db?

Запрос выглядит следующим образом:

DECLARE @location as varchar(50) 
DECLARE @srv as varchar(20) 
DECLARE @alphaDb as varchar(20) 

DECLARE LabCursor Cursor FOR 
SELECT Location, SQLServer, AlphaDB 
FROM Labs 

OPEN LabCursor 

DECLARE @sql as varchar(max) 

CREATE TABLE #tmpCombinedResults 
    (
    Lab varchar(50) NULL, 
    Department varchar(50) NULL, 
    Instrument varchar(50) NULL, 
    Method varchar(50) NULL, 
    Matrix varchar(50) NULL, 
    StudyDate datetime NULL, 
    StudyNumber int NULL 
) 

FETCH NEXT FROM LabCursor INTO @location, @srv, @alphaDb 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    -- query with both metals and alpha 
    SET @sql = 
    ' 
    CREATE TABLE #tmpResults 
    (
     Lab varchar(50) NULL, 
     Department varchar(50) NULL, 
     Instrument varchar(50) NULL, 
     Method varchar(50) NULL, 
     Matrix varchar(50) NULL, 
     StudyDate datetime NULL, 
     StudyNumber int NULL 
    ) 

    INSERT INTO #tmpResults(Department, Instrument, Method, Matrix, StudyDate, StudyNumber) 
    SELECT t.Dept, 
     oms.InstrumentID, 
     oms.Method, 
     oms.Matrix, 
     MAX(oms.DateOfStudy) StudyDate, 
     oms.StudyNum 
    FROM [' + @alphaDb + '].[dbo].AnalRunSeq ars 
     INNER JOIN [' + @alphaDb + '].[dbo].ottMDL1Studies oms ON ars.TestNo = oms.Method 
     INNER JOIN [' + @alphaDb + '].[dbo].Tests t ON ars.TestCode = t.TestCode 
     INNER JOIN [' + @alphaDb + '].[dbo].AnalRuns ar ON ars.RunID = ar.RunID 
      AND oms.InstrumentID = ar.InstrumentID 
      AND oms.Analyst = ar.Analyst 
     INNER JOIN [' + @alphaDb + '].[dbo].Instruments i ON oms.InstrumentID = i.InstrumentID 
    WHERE oms.ActiveStudy <> 0 
     AND oms.TypeOfStudy = ''MDL'' 
    GROUP BY oms.InstrumentID, 
     oms.Method, 
     oms.Matrix, 
     oms.StudyNum, 
     t.Dept, 
     i.InActive 
    HAVING t.Dept Not In 
     (''sub-org'',''sub'',''subpr'') 
     AND i.InActive = 0 
    ORDER BY oms.InstrumentID 

    --error occurs in this part of the code 
    IF (SELECT COUNT(*) as Qty FROM ' + @srv + '.master.sys.databases where name = ''MetalData'') > 0 
    BEGIN 
     UPDATE #tmpResults 
     SET Department = ''ME'', 
      Instrument = ms.InstrumentID, 
      Method = ms.TestNo, 
      Matrix = ms.Matrix, 
      StudyDate = (SELECT MAX(ms.InUseDate) 
         FROM [Metals].[dbo].MDLStudies ms 
         WHERE ms.InUseDate = InUseDate) 
     FROM #tmpResults tmp 
      INNER JOIN ' + @srv + '.[Metals].[dbo].MDLStudies ms ON tmp.Instrument = ms.InstrumentID 
     WHERE ms.Active = 1 
    END 

    SELECT ''' + @location + ''' AS Lab, 
     Department, 
     Instrument, 
     Method, 
     Matrix, 
     StudyDate, 
     StudyNumber 
    FROM #tmpResults 
    ORDER BY Lab, Department, Instrument 

    DROP TABLE #tmpResults 
    ' 

    IF DB_NAME() <> @alphaDb 
    BEGIN 
    SET @sql = 'EXEC(''' + REPLACE(@sql, '''', '''''') + ''') at ' + @srv 
    END 

    INSERT INTO #tmpCombinedResults 
    EXEC(@sql) 

    FETCH NEXT FROM LabCursor INTO @location, @srv, @alphaDb 
END 

CLOSE LabCursor 
DEALLOCATE LabCursor 

SELECT * 
FROM #tmpCombinedResults 

DROP TABLE #tmpCombinedResults 

текущие решения, которые я нашел в Интернете, все изложенные here не работал для меня тоже. Это one, в частности, не имеет смысла, потому что я не вижу базы данных в качестве опции в левом столбце в описании обозревателя объектов.

Любая помощь для решения этой проблемы была бы принята с благодарностью!

ответ

0

Эта проблема вызвана тем, что пользователь не имеет надлежащих разрешений на двух из пяти серверов, на которые ссылается курсор. После того как разрешения были исправлены, проблема была решена.

 Смежные вопросы

  • Нет связанных вопросов^_^