Основной сервер SQL «dbo» не существует,

196

Я получаю следующую ошибку

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 ГБ каждый день.

PBG
источник
1
Вероятно, это вопрос к сайту администратора баз данных, но он поможет, если вы дадите больше информации о том, когда появляется ошибка, то есть какая команда не может быть выполнена. И есть много результатов поиска по этой ошибке, включая этот вопрос ; Вы смотрели на них и соответствуют ли они вашей ситуации и конфигурации?
Pondlife

Ответы:

416

Я решил эту проблему, установив владельца базы данных. У моей базы данных не было владельца до этой проблемы. Выполните эту команду в своей базе данных, чтобы установить владельца для учетной записи sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Hogan
источник
6
Смотрите подробную статью здесь: sqlserver-help.com/tag/...
orberkov
8
@hurleystylee, ваше решение на самом деле хорошо для меня. У моей БД был владелец кстати.
Кейван Садралодабай
У меня такая же проблема. Я попытался выполнить запрос по @hurleystylee, который он выполнил, но ничего не сделал. Когда я проверил, dboвсе еще был db_owner, и я ничего не могу сделать с DBO. Это действительно расстраивает. Я не могу ничего изменить.
Вайриму Муриги
@hurleystylee, пожалуйста, рассмотрите возможность редактирования и дополнения ответа, чтобы людям не приходилось просматривать комментарии, чтобы узнать синтаксис команды.
Улисс Алвес
2
@hurleystylee да, я вижу, что он сделал. Я думаю, что таким образом ответ становится более полным сам по себе.
Улисс Алвес
112

введите описание изображения здесь

Делать графически.

База данных правой кнопкой мыши -> свойства -> файлы -> выбрать владельца базы данных -> выбрать [sa] - ок

arnav
источник
еще раз решил мою проблему, вернувшись к этому ответу.
Чайник
Успешно справился! Спасибо!
Алехандроб
Мы восстановили БД из экземпляра diff SQL. Я следовал за этим шагом, и он работал .. Спасибо!
dotnetavalanche
11

Это также может произойти, когда база данных представляет собой восстановление с другого сервера или экземпляра SQL. В этом случае субъект безопасности 'dbo' в базе данных не совпадает с субъектом безопасности на сервере SQL, на котором была восстановлена ​​база данных. Не спрашивайте меня, откуда я это знаю ...

Питер Хупперц
источник
Могу ли я спросить вас, как решить это? лол, это именно то, что я пытаюсь сделать. Переместите диаграммы базы данных между различными серверами, а затем внедрите базу данных. Я получил эту ошибку, как только я импортировал файл .bak и попытался открыть папку диаграмм.
стрелок
1
Эй, это работает для меня: dba.stackexchange.com/questions/50690/...
ironstone13
@ Ironstone13 не работает для меня. Я получил сообщение, что я не могу бросить
дбо
8

другой способ сделать это

ALTER AUTHORIZATION 
ON DATABASE::[DatabaseName]
TO [A Suitable Login];
Mugiwara
источник
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]

показать все имена входа (и их SID) для этого экземпляра сервера SQL. Обратите внимание, что он не записывал префикс db_name, потому что каждая база данных имеет одинаковую информацию в этом представлении.

Таким образом, в случае ошибки выше не будет входа с SID, который назначен пользователю базы данных dbo.

Как объяснено выше, это обычно происходит при восстановлении базы данных с другого компьютера (где база данных и пользователь dbo были созданы с использованием другого имени входа). И вы можете это исправить, изменив владельца на существующий логин.

Bizniztime
источник
0

В разделе Безопасность добавьте принципала как «пользователя SQL без входа в систему», сделайте его владельцем схемы с тем же именем, что и принципал, а затем в членстве сделайте его db_owner.

Дэвид Замула
источник
Это ничего не сделало в
SSMS
0

Также имелась ошибка при случайной подаче строки подключения к базе данных в зеркало только для чтения, а не в основную базу данных в настройке высокой доступности.

указ
источник
0

Как говорится в сообщении, вы должны установить разрешение как владелец для вашего пользователя. Таким образом, вы можете использовать следующее:

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

Надеюсь полезно! Оставьте комментарий, если это нормально для вас.

Алиреза Абдоллахнеджад
источник
0

В моем случае я получил эту ошибку при попытке выдать себя за другого пользователя. Например

EXEC AS USER = 'dbo';

И поскольку база данных была импортирована из другой среды, некоторые из ее пользователей не соответствовали именам входа SQL Server.

Вы можете проверить, есть ли у вас такая же проблема, запустив (устарело) sp_change_users_login (в режиме «Отчет»), или использовать следующий запрос:

select p.name,p.sid "sid in DB", (select serp.sid from sys.server_principals serp where serp.name = p.name) "sid in server"
from sys.database_principals p
where p.type in ('G','S','U')
and p.authentication_type = 1
and p.sid not in (select sid from sys.server_principals)

Если в этом списке показан пользователь, которого вы пытаетесь выдать, то, вероятно, вы можете исправить это, назначив пользователя БД для правильного входа в систему на вашем сервере. Например:

ALTER USER dbo WITH LOGIN = dbo;
Мариано Дезанце
источник