다음과 같은 오류가 발생합니다
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'
답변
답변
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'
dbo
DB_NAME 데이터베이스에서 사용자의 SID를 보여줍니다.
SELECT [name],[sid]
FROM [sys].[syslogins]
이 SQL Server 인스턴스에 대한 모든 로그인 및 SID를 표시합니다. db_name 접두어를 쓰지 않았습니다. 모든 데이터베이스가 해당 뷰에서 동일한 정보를 가지고 있기 때문입니다.
따라서 위의 오류가 발생 하면 하면 데이터베이스 dbo 사용자에게 지정된 SID 로그인 .
위에서 설명한 것처럼 일반적으로 다른 컴퓨터에서 데이터베이스를 복원 할 때 발생합니다 (데이터베이스 및 dbo 사용자가 다른 로그인으로 작성 됨). 소유권을 기존 로그인으로 변경하여 문제를 해결할 수 있습니다.
답변
위의 방법으로 문제가 해결되지 않으면 다음을 시도하십시오. 소유자가 데이터베이스에 대해 잘 정의 된 경우에도 문제가 해결되었습니다.