[sql-server-2008] SQL Server 보안 주체 “dbo”가 없습니다.

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

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 씩 오류 로그를 증가시킵니다.



답변

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

use [YourDatabaseName] EXEC sp_changedbowner 'sa'


답변

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

그래픽으로하십시오.

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


답변

USE [<dbname>]
GO
sp_changedbowner '<user>' -- you can use 'sa' as a quick fix in databases with SQL authentication

KB913423-SQL Server 2005에서 데이터베이스를 복원 한 후 EXECUTE AS 절이 포함 된 문이나 모듈을 실행할 수 없습니다.


답변

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


답변

그것을하는 또 다른 방법

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


답변

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

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 사용자가 다른 로그인으로 작성 됨). 소유권을 기존 로그인으로 변경하여 문제를 해결할 수 있습니다.


답변

위의 방법으로 문제가 해결되지 않으면 다음을 시도하십시오. 소유자가 데이터베이스에 대해 잘 정의 된 경우에도 문제가 해결되었습니다.

SQL Server 2008 복제 실패 : 프로세스가 ‘sp_replcmds’를 실행할 수 없습니다