SQL Serverプリンシパル「dbo」は存在しません。


192

次のエラーが発生します

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増加しています。


1
これはおそらくDBAサイトへの質問ですが、エラーが発生したとき、つまり実行できないコマンドについての詳細情報を提供すると役立ちます。そして、この質問を含むこのエラーの検索結果はたくさんあります。あなたはそれらを見て、何らかの形であなたの状況と構成に一致していますか?
ポンドライフ

回答:


408

この問題は、データベースの所有者を設定することで解決しました。この問題が発生するまで、私のデータベースには所有者はいませんでした。データベースで次のコマンドを実行して、所有者をsysadminアカウントに設定します。

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
ここでは詳細な記事を参照してください。sqlserver-help.com/tag/...
orberkov

8
@hurleystylee、あなたの解決策は実際私にとってうまくいきました。私のDBには所有者がいました。
Keyvan Sadralodabai 2016

私はこれと同じ問題を抱えています。実行した@hurleystyleeでクエリを実行しようとしましたが、何も実行されませんでした。チェックしdboたときはまだdb_ownerで、DBOには何もできません。本当にイライラしている。物事を変えることはできません。
Wairimu Murigi 2017

@hurleystyleeは、コマンド構文を見つけるためにコメントを確認する必要がないように、回答を編集および補足することを検討してください。
ユリシーズアルベス

2
@hurleystyleeはい、彼はそうしました。このようにして、答えはそれ自体でより完全になると思います。
Ulysses Alves、

110

ここに画像の説明を入力してください

グラフィカルに行います。

データベースを右クリック->プロパティ->ファイル->データベース所有者を選択-> [sa]を選択--ok


もう一度この回答を参照して、問題を解決しました。
teapeng

ばっちり成功!ありがとうございました!
alejandrob

差分SQLインスタンスからDBを復元しました。私はこのステップを踏みました、そしてそれは働きました。
dotnetavalanche


11

これは、データベースが別のSQLサーバーまたはインスタンスからの復元である場合にも発生することがあります。その場合、データベースのセキュリティプリンシパル「dbo」は、dbが復元されたSQLサーバーのセキュリティプリンシパルと同じではありません。どうやってこれを知っているのか聞かないで...


解決方法を教えてもらえますか?笑、それはまさに私がやろうとしていることです。異なるサーバー間でデータベースダイアグラムを移動し、データベースを実装します。.bakファイルをインポートして、ダイアグラムフォルダーを開こうとすると、このエラーが発生しました。
gunslingor

1
ねえ、これは私の仕事:dba.stackexchange.com/questions/50690/...
ironstone13

@ ironstone13は機能しませんでした。dboをドロップできないというメッセージを
受け取りました

8

それを行う別の方法

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

6

選ばれた答えと他のいくつかはすべて良いです。SQLについてより純粋に説明したいだけです。(有効な)データベース所有者がいないのと同じソリューションになります。

dboエラーで言及されているデータベース所有者アカウントは、常にデータベースで作成されます。だから、それが存在しないのは奇妙に思えますが、2つの選択で確認できます(または1つだけですが、単純にしておくことにしましょう)。

SELECT [name],[sid] 
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'

これはdbo、DB_NAMEデータベース内のユーザーのSIDを示し、

SELECT [name],[sid] 
FROM [sys].[syslogins]

このSQLサーバーインスタンスのすべてのログイン(およびそのSID)を表示します。すべてのデータベースのビューに同じ情報が含まれているため、db_name接頭辞は書き込まれていません。

したがって、上記のエラーの場合はありませんデータベースのdboユーザーに割り当てられているSIDでのログイン。

上記で説明したように、これは通常、別のコンピューターからデータベースを復元するときに発生します(データベースとdboユーザーは別のログインで作成されました)。また、所有権を既存のログインに変更することで修正できます。



0

[セキュリティ]で、プリンシパルを「ログインなしのSQLユーザー」として追加し、プリンシパルと同じ名前のスキーマを所有するようにします。次に、メンバーシップでdb_ownerにします。


これはSSMS 2017では何もしませんでした
Zimano

0

また、HA接続のプライマリデータベースではなく、データベース接続文字列を読み取り専用ミラーに誤って入力したときにも、このエラーが発生しました。


0

メッセージが言ったように、所有者としての権限をユーザーに設定する必要があります。したがって、以下を使用できます。

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

お役に立てば幸いです。よろしければコメントを残してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.