SQL Server 보안 주체 "dbo"가 없습니다.


194

다음과 같은 오류가 발생합니다

Cannot execute as the database principal because the principal "dbo" 
does not exist, this type of principal cannot be impersonated,
or you do not have permission.

에 대해 읽었 ALTER AUTHORIZATION지만이 데이터베이스에서 어떤 데이터베이스가 발생하고 있는지 전혀 알지 못합니다.이 오류는 매우 자주 발생하며 매일 약 1GB 씩 오류 로그를 증가시킵니다.


1
이것은 DBA 사이트에 대한 질문 일 수 있지만 오류가 언제 나타나는지, 즉 어떤 명령을 실행할 수 없는지에 대한 자세한 정보를 제공하면 도움이됩니다. 이 질문을 포함 하여이 오류에 대한 검색 결과가 많이 있습니다 . 그것들을 보았고 어떤 방식 으로든 상황과 구성에 일치합니까?
Pondlife

답변:


414

데이터베이스 소유자를 설정하여이 문제를 해결했습니다. 이 문제 전에 내 데이터베이스에 소유자가 없었습니다. 소유자를 sysadmin 계정으로 설정하려면 데이터베이스에서이 명령을 실행하십시오.

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
자세한 기사는 여기를 참조하십시오 : sqlserver-help.com/tag/…
orberkov

8
@hurleystylee, 귀하의 솔루션은 실제로 저에게 효과적이었습니다. 내 DB에는 소유자가 btw였습니다.
Keyvan Sadralodabai

이 같은 문제가 있습니다. @hurleystylee이 실행 한 쿼리를 실행하려고했지만 아무것도하지 않았습니다. 내가 확인했을 때 dbo여전히 db_owner 였고 DBO에 아무것도 할 수 없습니다. 정말 실망 스럽습니다. 변경할 수 없습니다.
Wairimu Murigi

@hurleystylee 사람들이 명령 구문을 찾기 위해 주석을 볼 필요가 없도록 답을 편집하고 보완하는 것을 고려하십시오.
율리시스 알베스

2
@hurleystylee 네, 그가 봤습니다. 나는 이런 식으로 대답 자체가 더 완전 해 진다고 생각합니다.
Ulysses Alves

112

여기에 이미지 설명을 입력하십시오

그래픽으로하십시오.

데이터베이스 오른쪽 클릭-> 속성-> 파일-> 데이터베이스 소유자 선택-> [sa] 선택-확인


이 답변을 다시 참조하여 내 문제를 다시 한 번 해결했습니다.
teapeng

못을 박았다! 감사합니다!
alejandrob

우리는 diff SQL 인스턴스에서 DB를 복원했습니다. 나는이 단계를 따랐고 효과가 있었다 .. 감사합니다!
dotnetavalanche


11

데이터베이스가 다른 SQL Server 또는 인스턴스에서 복원 된 경우에도 발생할 수 있습니다. 이 경우 데이터베이스의 보안 주체 'dbo'는 db가 복원 된 SQL Server의 보안 주체와 동일하지 않습니다. 내가 어떻게 이것을 알고 있는지 묻지 마라.


어떻게 해결해야합니까? lol, 내가하려는 바로 그거야. 다른 서버간에 데이터베이스 다이어그램을 이동 한 다음 데이터베이스를 구현하십시오. .bak 파일을 가져 와서 다이어그램 폴더를 열려고하면이 오류가 발생했습니다.
gunslingor

1
안녕하세요, 이것은 나를 위해 일했습니다 : dba.stackexchange.com/questions/50690/…
ironstone13

@ ironstone13이 작동하지 않았습니다. 나는 dbo를 떨어 뜨릴 수 없다는 메시지를 받았다
Wairimu Murigi

8

그것을하는 또 다른 방법

ALTER AUTHORIZATION 
ON DATABASE::[DatabaseName]
TO [A Suitable Login];

6

엄선 된 답변과 다른 것들은 모두 좋습니다. 더 순수한 설명을 원합니다. (유효한) 데이터베이스 소유자가없는 것과 동일한 솔루션이 제공됩니다.

dbo오류로 언급 된 데이터베이스 소유자 계정 은 항상 데이터베이스로 작성됩니다. 존재하지 않는 것이 이상해 보이지만 두 가지 선택 (또는 하나를 선택하지만 간단하게 유지)으로 확인할 수 있습니다.

SELECT [name],[sid] 
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'

dboDB_NAME 데이터베이스에서 사용자의 SID를 보여줍니다.

SELECT [name],[sid] 
FROM [sys].[syslogins]

이 SQL Server 인스턴스에 대한 모든 로그인 및 SID를 표시합니다. db_name 접두어를 쓰지 않았습니다. 모든 데이터베이스가 해당 뷰에서 동일한 정보를 가지고 있기 때문입니다.

따라서 위의 오류가 발생 하면 하면 데이터베이스 dbo 사용자에게 지정된 SID 로그인 .

위에서 설명한 것처럼 일반적으로 다른 컴퓨터에서 데이터베이스를 복원 할 때 발생합니다 (데이터베이스 및 dbo 사용자가 다른 로그인으로 작성 됨). 소유권을 기존 로그인으로 변경하여 문제를 해결할 수 있습니다.



0

보안에서 프린시 펄을 "로그인없는 SQL 사용자"로 추가하고 프린시 펄과 동일한 이름의 스키마를 소유 한 다음 멤버십에서 db_owner로 설정하십시오.


이것은 SSMS 2017에서 아무것도하지 않았습니다
Zimano

0

또한 HA 설정의 기본 데이터베이스가 아닌 데이터베이스 연결 문자열을 읽기 전용 미러에 실수로 공급 한 경우에도이 오류가 발생했습니다.


0

메시지가 말했듯이 사용자의 소유자 권한을 설정해야합니다. 따라서 다음을 사용할 수 있습니다.

ALTER AUTHORIZATION 
ON DATABASE::[YourDBName]
TO [UserLogin];

도움이 되길 바랍니다. 괜찮다면 의견을 남겨주세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.