SQL Server ตัวหลัก“ dbo” ไม่มีอยู่


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นี้ แต่ฉันไม่รู้ว่าฐานข้อมูลนี้เกิดอะไรขึ้นข้อผิดพลาดนี้ทำให้เกิดการคายออกบ่อยมากและเพิ่มบันทึกข้อผิดพลาดประมาณ 1GB ทุกวัน


1
นี่อาจเป็นคำถามสำหรับไซต์ DBA แต่มันจะช่วยถ้าคุณให้ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดที่ปรากฏขึ้นนั่นคือคำสั่งใดไม่สามารถดำเนินการได้ และมีมากมายของผลการค้นหาสำหรับข้อผิดพลาดนี้รวมถึงคำถามนี้ ; คุณเคยดูพวกเขาและพวกเขาตรงกับสถานการณ์และการกำหนดค่าของคุณในทางใด?
Pondlife

คำตอบ:


414

ฉันแก้ไขปัญหานี้โดยตั้งค่าเจ้าของฐานข้อมูล ฐานข้อมูลของฉันไม่เคยมีเจ้าของมาก่อนปัญหานี้ ดำเนินการคำสั่งนี้ในฐานข้อมูลของคุณเพื่อตั้งค่าเจ้าของเป็นบัญชีดูแลระบบ:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
ดูบทความโดยละเอียดได้ที่นี่: sqlserver-help.com/tag/…
orberkov

8
@hurleystylee โซลูชันของคุณใช้ได้ดีสำหรับฉัน DB ของฉันมีเจ้าของ btw
Keyvan Sadralodabai

ฉันมีปัญหาเดียวกันนี้ ฉันพยายามเรียกใช้แบบสอบถามโดย @hurleystylee ดำเนินการแล้ว แต่ไม่ได้ทำอะไรเลย เมื่อฉันตรวจสอบdboก็ยังคงเป็น db_owner และฉันไม่สามารถทำอะไรกับ DBO มันน่าหงุดหงิดจริงๆ ฉันไม่สามารถเปลี่ยนแปลงอะไรได้
Wairimu Murigi

@hurleystylee โปรดพิจารณาแก้ไขและเสริมคำตอบเพื่อที่ผู้ใช้จะได้ไม่ต้องดูความคิดเห็นเพื่อค้นหาไวยากรณ์คำสั่ง
Ulysses Alves

2
@hurleystylee ใช่ฉันเห็นเขาทำ ฉันคิดว่าวิธีนี้คำตอบจะสมบูรณ์มากขึ้นในตัวของมันเอง
Ulysses Alves

112

ป้อนคำอธิบายรูปภาพที่นี่

ทำแบบกราฟิก

ฐานข้อมูลคลิกขวา -> คุณสมบัติ -> ไฟล์ -> เลือกเจ้าของฐานข้อมูล -> เลือก [sa] - ตกลง


แก้ไขปัญหาของฉันอีกครั้งโดยอ้างอิงกลับไปที่คำตอบนี้
teapeng

ถูกจับมัน! ขอบคุณ!
alejandrob

เราได้กู้คืนฐานข้อมูลจากอินสแตนซ์ SQL ต่าง ฉันทำตามขั้นตอนนี้แล้วและได้ผล .. ขอบคุณ!
dotnetavalanche


11

สิ่งนี้อาจเกิดขึ้นเมื่อฐานข้อมูลเป็นการกู้คืนจากเซิร์ฟเวอร์ SQL หรืออินสแตนซ์อื่น ในกรณีดังกล่าวหลักการรักษาความปลอดภัย 'dbo' ในฐานข้อมูลจะไม่เหมือนกับหลักการรักษาความปลอดภัยบนเซิร์ฟเวอร์ SQL ที่ db ถูกกู้คืน อย่าถามฉันว่าฉันรู้สิ่งนี้ได้อย่างไร ...


ฉันขอวิธีแก้ปัญหาได้มั้ย ฮ่า ๆ นั่นคือสิ่งที่ฉันพยายามจะทำ ย้ายไดอะแกรมฐานข้อมูลระหว่างเซิร์ฟเวอร์ที่แตกต่างกันจากนั้นใช้ฐานข้อมูล ฉันได้รับข้อผิดพลาดนี้เมื่อฉันนำเข้าไฟล์. bak และพยายามเปิดโฟลเดอร์ไดอะแกรม
gunslingor

1
เฮ้สิ่งนี้ใช้ได้กับฉัน: dba.stackexchange.com/questions/50690/…
ironstone13

@ ironstone13 ไม่ทำงานสำหรับฉัน ฉันได้รับข้อความว่าฉันไม่สามารถดรอป dbo ได้
Wairimu Murigi


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 ถูกสร้างขึ้นโดยการเข้าสู่ระบบที่แตกต่างกัน) และคุณสามารถแก้ไขได้โดยเปลี่ยนความเป็นเจ้าของเป็นการเข้าสู่ระบบที่มีอยู่


2

หากข้างต้นไม่ทำงานลองต่อไปนี้ มันแก้ไขปัญหาให้ฉันได้แม้ว่าเจ้าของจะกำหนดไว้เป็นอย่างดีสำหรับฐานข้อมูล

การจำลองแบบ SQL Server 2008 ล้มเหลวด้วย: กระบวนการไม่สามารถดำเนินการ 'sp_replcmds'


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.