SQL Server chính không tồn tại dbo Cảnh không tồn tại,


192

Tôi nhận được lỗi sau

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.

Tôi đã đọc về nó ALTER AUTHORIZATION, nhưng tôi không biết cơ sở dữ liệu này đang xảy ra. Lỗi này được đưa ra rất thường xuyên và tăng nhật ký lỗi lên khoảng 1GB mỗi ngày.


1
Đây có lẽ là một câu hỏi cho trang web DBA, nhưng nó sẽ hữu ích nếu bạn cung cấp thêm thông tin về thời điểm xảy ra lỗi, tức là lệnh nào không thể được thực thi. Và có rất nhiều kết quả tìm kiếm cho lỗi này bao gồm cả câu hỏi này ; Bạn đã xem chúng và chúng có phù hợp với tình huống và cấu hình của bạn theo bất kỳ cách nào không?
Pondlife

Câu trả lời:


407

Tôi đã giải quyết vấn đề này bằng cách thiết lập cơ sở dữ liệu. Cơ sở dữ liệu của tôi không có chủ sở hữu trước vấn đề này. Thực hiện lệnh này trong cơ sở dữ liệu của bạn để đặt chủ sở hữu thành tài khoản sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
Xem bài viết chi tiết tại đây: sqlserver-help.com/tag/ từ
orberkov

8
@hurle Phonge, giải pháp của bạn thực sự hiệu quả với tôi. DB của tôi đã có chủ sở hữu btw.
Keyvan Sadralodabai

Tôi gặp vấn đề tương tự. Tôi đã cố chạy truy vấn bằng cách @hurle Phụce nó đã thực thi nhưng nó không làm gì cả. Khi tôi kiểm tra dbovẫn là db_owner và tôi KHÔNG THỂ LÀM ĐƯỢC NÀO ĐẾN DBO. Nó đang thực sự bực bội. Tôi không thể thay đổi một điều.
Wairimu Murigi

@hurle Phonge vui lòng xem xét chỉnh sửa và bổ sung câu trả lời để mọi người không phải xem các bình luận để tìm ra cú pháp lệnh.
Ulysses Alves

2
@hurle Phonge vâng, tôi thấy anh ấy đã làm. Tôi nghĩ theo cách này, câu trả lời trở nên hoàn thiện hơn.
Ulysses Alves

110

nhập mô tả hình ảnh ở đây

Làm đồ họa.

Nhấp chuột phải vào cơ sở dữ liệu -> thuộc tính -> tệp -> chọn chủ sở hữu cơ sở dữ liệu -> chọn [sa] - ok


một lần nữa giải quyết vấn đề của tôi bằng cách tham khảo lại câu trả lời này.
teapeng

Đóng đinh nó! Cảm ơn bạn!
alejandrob

Chúng tôi đã khôi phục DB từ phiên bản SQL khác. Tôi đã làm theo bước này và nó đã hoạt động .. Cảm ơn!
dotnetavalanche


11

Điều này cũng có thể xảy ra khi cơ sở dữ liệu là một khôi phục từ một máy chủ SQL hoặc cá thể khác. Trong trường hợp đó, hiệu trưởng bảo mật 'dbo' trong cơ sở dữ liệu không giống với hiệu trưởng bảo mật trên máy chủ SQL nơi db được khôi phục. Đừng hỏi tôi làm thế nào tôi biết điều này ...


Tôi có thể hỏi bạn làm thế nào để giải quyết nó? lol, đó chính xác là những gì tôi đang cố gắng làm. Di chuyển sơ đồ cơ sở dữ liệu giữa các máy chủ khác nhau và sau đó thực hiện cơ sở dữ liệu. Tôi đã gặp lỗi này khi tôi nhập tệp .bak và cố gắng mở thư mục sơ đồ.
xạ thủ

1
Này, này làm việc cho tôi: dba.stackexchange.com/questions/50690/...
ironstone13

@ ironstone13 không làm việc cho tôi. Tôi nhận được thông báo rằng tôi không thể thả dbo
Wairimu Murigi

8

một cách khác để làm điều đó

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

6

Câu trả lời được chọn và một số người khác đều tốt. Tôi chỉ muốn đưa ra một lời giải thích thuần túy hơn SQL. Nó đi đến cùng một giải pháp rằng không có chủ sở hữu cơ sở dữ liệu (hợp lệ).

Tài khoản chủ sở hữu cơ sở dữ liệu dbođược đề cập trong lỗi luôn được tạo bằng cơ sở dữ liệu. Vì vậy, có vẻ lạ là nó không tồn tại nhưng bạn có thể kiểm tra với hai lựa chọn (hoặc một nhưng hãy giữ cho nó đơn giản).

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

trong đó hiển thị SID của dbongười dùng trong cơ sở dữ liệu DB_NAME và

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

để hiển thị tất cả thông tin đăng nhập (và SID của chúng) cho phiên bản máy chủ SQL này. Lưu ý rằng nó không viết bất kỳ tiền tố db_name nào, bởi vì mọi cơ sở dữ liệu đều có cùng thông tin trong chế độ xem đó.

Vì vậy, trong trường hợp lỗi ở trên sẽ không có thông tin đăng nhập với SID được gán cho người dùng cơ sở dữ liệu dbo.

Như đã giải thích ở trên, điều này thường xảy ra khi khôi phục cơ sở dữ liệu từ một máy tính khác (nơi cơ sở dữ liệu và người dùng dbo được tạo bằng cách đăng nhập khác nhau). Và bạn có thể sửa nó bằng cách thay đổi quyền sở hữu để đăng nhập hiện có.



0

Trong Bảo mật, thêm hiệu trưởng dưới dạng "Người dùng SQL không đăng nhập", làm cho nó sở hữu lược đồ có cùng tên với hiệu trưởng và sau đó trong Tư cách thành viên, hãy tạo thành db_owner.


Điều này đã không làm bất cứ điều gì trên SSMS 2017
Zimano 26/03/19

0

Cũng gặp lỗi này khi vô tình đưa chuỗi kết nối cơ sở dữ liệu vào máy nhân bản chỉ đọc - không phải cơ sở dữ liệu chính trong thiết lập HA.


0

Như thông báo đã nói, bạn nên đặt quyền là chủ sở hữu cho người dùng của mình. Vì vậy, bạn có thể sử dụng như sau:

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

Hy vọng hữu ích! Để lại bình luận nếu nó ổn cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.