Принципал "dbo" SQL Server не существует,
Я получаю следующую ошибку
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
, но я понятия не имею, в какой базе данных это происходит. Эта ошибка часто выплевывается и растет журнал ошибок примерно на 1 ГБ каждый день.
Ответы
Ответ 1
Я решил эту проблему, установив владельца базы данных. У моей базы данных не было владельца до этой проблемы. Выполните эту команду в своей базе данных, чтобы установить владельца для учетной записи sysadmin:
use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Ответ 2
![введите описание изображения здесь]()
Сделайте графически.
Щелкните правой кнопкой мыши → свойства → файлы → выберите владельца базы данных → выберите [sa] - ok
Ответ 3
USE [<dbname>]
GO
sp_changedbowner '<user>' -- you can use 'sa' as a quick fix in databases with SQL authentication
KB913423 - Вы не можете запустить инструкцию или модуль, который включает предложение EXECUTE AS после восстановления базы данных в SQL Server 2005
Ответ 4
Это также может произойти, когда база данных является восстановлением с другого SQL-сервера или экземпляра. В этом случае в базе данных главный защитник "dbo" отличается от принципала безопасности на сервере SQL, на котором была восстановлена db.
Не спрашивайте меня, как я знаю это...
Ответ 5
другой способ сделать это
ALTER AUTHORIZATION
ON DATABASE::[DatabaseName]
TO [A Suitable Login];
Ответ 6
Выбранный ответ и некоторые другие хорошие. Я просто хочу дать более подробное объяснение SQL. Он приходит к тому же решению, что нет (действительного) владельца базы данных.
Аккаунт владельца базы данных dbo
, который упоминается в ошибке, всегда создается с базой данных. Так что кажется странным, что он не существует, но вы можете проверить его двумя выборами (или одним, но пусть это будет проще).
SELECT [name],[sid]
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'
который показывает SID пользователя dbo
в базе данных DB_NAME и
SELECT [name],[sid]
FROM [sys].[syslogins]
чтобы показать все логины (и их идентификаторы безопасности) для этого экземпляра SQL-сервера. Заметьте, что он не писал ни одного префикса db_name, потому что каждая база данных имеет ту же информацию в этом представлении.
Таким образом, в случае ошибки выше, не будет с SID, назначенным пользователю базы данных dbo.
Как объяснялось выше, обычно это происходит при восстановлении базы данных с другого компьютера (где базы данных и пользователя dbo были созданы с помощью другого входа). И вы можете исправить это, изменив права собственности на существующий логин.
Ответ 7
Если вышеуказанное не работает, попробуйте следующее. Он решил проблему для меня, даже когда владелец был хорошо определен для базы данных.
Ошибка репликации SQL Server 2008 с: процессом не удалось выполнить 'sp_replcmds'
Ответ 8
В разделе Безопасность добавьте принципала как "пользователя SQL без входа в систему", сделайте его владельцем схемы с тем же именем, что и принципал, а затем в членстве сделайте его db_owner.
Ответ 9
Также имелась ошибка при случайной подаче строки подключения к базе данных в зеркало только для чтения, а не в основную базу данных в настройке HA.