[sql-server] 서버 보안 주체는 SQL Server MS 2012의 현재 보안 컨텍스트에서 데이터베이스에 액세스 할 수 없습니다.

SQL Server Management Studio를 통해 호스팅 서버의 데이터베이스에 액세스하려고합니다. 로그인 할 때까지 모든 것이 정상이지만 명령을 사용하면 use myDatabase이 오류가 발생합니다.

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

검색 결과 호스팅 서비스 제공 업체가 문제에 대한 수정 사항을 나열 했습니다 .

그러나 이것은 아마도 SQL Server Management Studio 2008 용이기 때문에 작동하지 않지만 SQL Server Management Studio 2012를 사용하고 있습니다.

이것이 문제가 될 수 있습니까? 그렇다면 누구든지 SSMS 2012에서 대안을 말할 수 있습니까?



답변

로그인하려는 DB에 사용자가 매핑되어 있는지 확인하십시오.


답변

PROD 환경에서 SSRS에 보고서를 배포하는 동안 동일한 오류가 발생했습니다. 문제는 “사용”문구로 재현 할 수도 있다는 사실을 발견했습니다. 해결책은 사용자의 GUID 계정 참조를 문제의 데이터베이스와 다시 동기화하는 것입니다 (예 : db를 복원 한 후처럼 “sp_change_users_login”사용). 모든 계정을 다시 동기화하는 주식 (커서 기반) 스크립트가 첨부됩니다.

USE <your database>
GO

-------- Reset SQL user account guids ---------------------
DECLARE @UserName nvarchar(255)
DECLARE orphanuser_cur cursor for
      SELECT UserName = su.name
      FROM sysusers su
      JOIN sys.server_principals sp ON sp.name = su.name
      WHERE issqluser = 1 AND
            (su.sid IS NOT NULL AND su.sid <> 0x0) AND
            suser_sname(su.sid) is null
      ORDER BY su.name

OPEN orphanuser_cur
FETCH NEXT FROM orphanuser_cur INTO @UserName

WHILE (@@fetch_status = 0)
BEGIN
--PRINT @UserName + ' user name being resynced' 
exec sp_change_users_login 'Update_one', @UserName, @UserName
FETCH NEXT FROM orphanuser_cur INTO @UserName
END

CLOSE orphanuser_cur
DEALLOCATE orphanuser_cur


답변

나는이 문제와 씨름하는 데 꽤 오랜 시간을 보냈고, 내가 내 연결을 목표로 삼고있는 특정 데이터베이스를 잊었다는 사실에 간단한 실수를하고 있다는 것을 깨달았다. 표준 SQL Server 연결 창을 사용하여 자격 증명을 입력했습니다.

SQL Server 연결 창

나는 확인했다 연결 속성 I 연결할 올바른 데이터베이스를 선택되었는지 확인하는 탭을 선택합니다. 실수 로 데이터베이스에 연결 옵션을 이전 세션의 선택 항목으로 설정했습니다. 이것이 제가 연결 하려고 했던 데이터베이스에 연결할 수없는 이유 입니다.

연결 속성

연결 속성 및 기타 탭을 표시 하려면 Options >>단추 를 클릭해야 합니다.


답변

이것은 나를 위해 일했습니다.

use <Database>
EXEC  sp_change_users_login @Action='update_one', @UserNamePattern='<userLogin>',@LoginName='<userLogin>';

문제는 다음과 같이 시각화 할 수 있습니다.

SELECT sid FROM sys.sysusers WHERE name = '<userLogin>'
SELECT sid FROM sys.syslogins WHERE name = '<userLogin>';


답변

SQL 로그인 은 서버 수준에서 정의되며 특정 데이터베이스의 사용자 에 매핑되어야 합니다.

SSMS 개체 탐색기에서 수정하려는 서버 아래에서 보안 > 로그인을 확장 한 다음 적절한 사용자를 두 번 클릭하면 “로그인 속성”대화 상자가 나타납니다.

사용자 매핑을 선택 하면 기존 매핑이 선택된 데이터베이스와 함께 서버의 모든 데이터베이스가 표시됩니다. 여기에서 추가 데이터베이스를 선택한 다음 (사용자가 속해야하는 각 데이터베이스의 역할을 선택해야 함) 확인 을 클릭 하여 매핑을 추가 할 수 있습니다.

여기에 이미지 설명 입력

이러한 매핑은 복원 또는 유사한 작업 후에 연결이 끊어 질 수 있습니다. 이 경우 사용자는 데이터베이스에 여전히 존재할 수 있지만 실제로 로그인에 매핑되지는 않습니다. 이 경우 다음을 실행하여 로그인을 복원 할 수 있습니다.

USE {database};
ALTER USER {user} WITH login = {login}

DB 사용자를 삭제하고 로그인 속성 대화 상자에서 다시 만들 수도 있지만 모든 역할 멤버 자격 또는 기타 설정을 다시 만들어야합니다.


답변

필자의 경우 메시지는 “개체 이름”에 데이터베이스 이름이 실수로 포함 된 동의어로 인해 발생했습니다. 새 이름으로 데이터베이스를 복원 할 때 동의어는 여전히 이전 DB 이름을 가리 킵니다. 사용자는 이전 DB에 대한 권한이 없기 때문에 메시지가 나타납니다. 수정하기 위해 데이터베이스 이름으로 개체 이름을 한정하지 않고 동의어를 삭제하고 다시 만들었습니다.

    USE [new_db]
GO

/****** Object:  Synonym [dbo].[synTable]    Script Date: 10/15/2015 9:45:01 AM ******/
DROP SYNONYM [dbo].[synTable]
GO

/****** Object:  Synonym [dbo].[synTable]    Script Date: 10/15/2015 9:45:01 AM ******/
CREATE SYNONYM [dbo].[synTable] FOR [dbo].[tTheRealTable]
GO


답변

사용자가 로그인에 올바르게 매핑되었지만 동일한 오류가 발생했습니다.

사용자 삭제를 시도한 후 몇 개의 SP에 해당 사용자가 “다음 계정으로 실행”이 포함되어 있음이 발견되었습니다.

이 문제는 해당 SP를 삭제하고, 사용자를 삭제하고, 로그인에 연결된 사용자를 다시 생성하고, SP를 다시 생성하여 해결되었습니다.

백업에서 복원 (관련 로그인이 존재하지 않는 시간 동안) 또는 대량 스키마 동기화 (사용자가 존재하지 않는 것처럼 실행하여 SP를 생성 할 수있는 경우)에서이 상태가되었을 수 있습니다. 이 답변 과 관련 있습니다.