Принцип "dbo" SQL Server не існує,


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, але я поняття не маю, в якій базі даних це відбувається. Ця помилка висипається дуже часто і щодня збільшує журнал помилок приблизно на 1 Гб.


1
Це, мабуть, питання для сайту DBA, але це допоможе, якщо ви дасте більше інформації про те, коли з’явиться помилка, тобто яка команда не може бути виконана. І для цієї помилки є багато результатів пошуку, включаючи це питання ; Ви подивилися на них і чи відповідають вони вашій ситуації та конфігурації?
Pondlife

Відповіді:


414

Я вирішив цю проблему, встановивши власника бази даних. Моя база даних не мала жодного власника до цього випуску. Виконайте цю команду у вашій базі даних, щоб встановити власника облікового запису sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
Детальну статтю дивіться тут: sqlserver-help.com/tag/…
orberkov

8
@hurleystylee, ваше рішення насправді добре спрацювало для мене. У моєї БД був власник btw.
Кейван Садралодабай

У мене є те саме питання. Я намагався запустити запит від @hurleystylee, який він виконував, але нічого не вдіяв. Коли я перевірив, чи dboвсе ще був власник db_owner, і я НЕ МОЖУ НЕ РОБИТИ ВСІМ ДРО. Це стає дуже неприємно. Я нічого не можу змінити.
Wairimu Murigi

@hurleystylee, будь ласка, подумайте про редагування та доповнення відповіді, щоб людям не доведеться дивитись на коментарі, щоб дізнатися синтаксис команд.
Улісс Алвес

2
@hurleystylee так, я бачу, що він зробив. Я думаю, що таким чином відповідь сама по собі стає більш повною.
Улісс Алвеш

112

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

Робіть графічно.

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


ще раз вирішив мою проблему, повернувшись до цієї відповіді.
teapeng

Прибила його! Дякую!
alejandrob

У нас було відновлено БД з екземпляра diff SQL. Я дотримувався цього кроку, і він спрацював .. Дякую!
dotnetavalanche


11

Це також може статися, коли база даних є відновленням з іншого SQL-сервера або екземпляра. У цьому випадку головний захист 'dbo' в базі даних не є тим самим, що головний захист на сервері SQL, на якому відновлено db. Не питайте мене, як я це знаю ...


Чи можу я запитати вас, як це вирішити? хаха, саме це я намагаюся зробити. Перемістіть діаграми бази даних між різними серверами, а потім реалізуйте базу даних. Я отримав цю помилку, коли імпортував файл .bak і спробував відкрити папку діаграм.
зброя

1
Гей, це працює для мене: dba.stackexchange.com/questions/50690 / ...
ironstone13

@ ironstone13 не працював для мене. Мені
прийшло

8

інший спосіб зробити це

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]

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

Тож у випадку помилки вище не буде входу з SID, який призначений користувачеві бази даних dbo.

Як було пояснено вище, зазвичай це відбувається при відновленні бази даних з іншого комп'ютера (де база даних та користувач dbo створювалися за допомогою різних логін). І ви можете виправити це, змінивши право власності на існуючий логін.



0

У розділі Безпека додайте головного користувача як "користувача SQL без входу в систему", зробіть його власником схеми з тим же ім'ям, що і головний, а потім у "Членстві" зробіть його db_owner.


Це не зробило нічого в SSMS 2017
Zimano

0

Ця помилка також мала місце при випадковому введенні рядка підключення бази даних до дзеркала для читання - не первинної бази даних в налаштуваннях HA.


0

Як сказано в повідомленні, ви повинні встановити дозвіл як власника для свого користувача. Отже, ви можете використовувати наступне:

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

Сподіваюся, корисна! Залиште коментар, якщо для вас це нормально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.