Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Szczegóły
| Attribute | Value |
|---|---|
| Nazwa produktu | SQL Server |
| Identyfikator zdarzenia | 15517 |
| Źródło zdarzenia | MSSQLSERVER |
| Składnik | SQLEngine |
| Nazwa symboliczna | SEC_CANNOTEXECUTEASUSER |
| Tekst wiadomości | Nie można wykonać jako principal bazy danych, ponieważ principal "principal" nie istnieje, tego typu principal nie może być podszyty lub nie masz pozwolenia. |
Explanation
Błąd ten zwykle występuje, ponieważ Microsoft SQL Server nie jest w stanie uzyskać informacji o kontekście wykonania zasady, które zostały określone w instrukcji użytkownika lub module, używając tego EXECUTE AS polecenia.
Identyfikator bezpieczeństwa danych logowania (SID) jest automatycznie zapisywany po utworzeniu bazy danych na instancji SQL Server jako właściciel bazy danych w odpowiadającym wierszu bazy danych w tabeli sys.databases oraz dla elementu dbo użytkownika w tabeli sys.database_principals w bazie danych.
Instrukcje lub moduły wykorzystujące klauzulę EXECUTE AS OWNER będą działać zgodnie z oczekiwaniami, jeśli wpis SID przechowywany dla użytkownika dbo jest poprawny.
Uwaga / Notatka
Problem może wystąpić przy każdym principalu użytym w instrukcji, EXECUTE AS który nie istnieje na serwerze, do którego baza danych jest przywracana.
Oto kilka typowych scenariuszy, które mogą powodować ten problem:
Przywracasz bazę danych na tym samym serwerze, gdzie pierwotnie wykonano kopię zapasową, ale zasada SQL Server, która stworzyła bazę danych, z jakiegoś powodu nie jest już ważna. Przykład:
- Logowanie do uwierzytelniania SQL Server zostało usunięte.
- Logowanie do Windows authentication nie jest już przeznaczone dla ważnego użytkownika w Active Directory, ponieważ pracownik opuścił firmę.
Przywracasz bazę danych na serwerze, która różni się od instancji, w której pierwotnie wykonano kopię zapasową, ale zasada SQL Server, która stworzyła bazę danych, nie jest ważną zasadą na nowym serwerze.
- Jeśli użytkownik jest logowaniem do SQL Server, główny użytkownik może istnieć na docelowym lub docelowym serwerze, ale wartość
sidbędzie inna. - Jeśli użytkownik jest logowany przez Windows, logowanie do Windows nie istnieje na docelowym serwerze lub nie jest już ważne.
- Jeśli użytkownik jest logowaniem do SQL Server, główny użytkownik może istnieć na docelowym lub docelowym serwerze, ale wartość
Użytkownik lub aplikacja uruchamiająca procedurę, funkcję lub wyzwalacz nie ma odpowiednich uprawnień, aby podszyć się pod główną osobę określoną w EXECUTE AS instrukcji.
Akcja użytkownika
Użyj nazwy istniejącego podmiotu lub przyznaj wymaganym użytkownikom pozwolenie IMPERSONATE na ten podmiot.
Aby rozwiązać problem wynikający z nieprawidłowego błędu użytkownika dbo, zmień dbo_User wartość na ważny login na serwerze, uruchamiając następujące polecenie:
ALTER AUTHORIZATION ON DATABASE:: DBName TO [NewLogin]
Przykładowy scenariusz
Stwórz dwa tymczasowe zasady:
CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb'; CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b';Dodaj te logowania do roli administratora systemu (tylko dla demonstracji).
Zaloguj się do swojej instancji SQL Server, używając
login1.Stwórz demonstracyjną bazę danych oraz procedurę przechowywaną, która zostanie
testexecnazwana, uruchamiając następujący skrypt:CREATE DATABASE Demodb_15517 GO USE Demodb_15517 GO CREATE procedure [dbo].[testexec] WITH EXECUTE AS owner AS SELECT @@VERSION GO EXEC dbo.testexec GOUruchom następujące zapytania i sprawdź, czy wartości
sidrozwiązują się z poprawnym logowaniem:Zapytanie 1: Sprawdź wartość
Owner_Namewartości w sys.databases.SELECT NAME AS Database_Name, owner_sid, SUSER_SNAME(owner_sid) AS OwnerName FROM sys.databases WHERE NAME = N'Demodb_15517';Database_Name owner_sid OwnerName --------------------- -------------------------------------- ---------------------------- Demodb_15517 0xDB79ED7B6731CF4E8DC7DF02871E3E36 login1Zapytanie 2: Sprawdź
Owner_Namewartość w tabelisys.database_principalsw bazie demonstracyjnej:SELECT SUSER_SNAME(sid) AS Owner_Name, sid FROM Demodb_15517.sys.database_principals WHERE NAME = N'dbo';Owner_Name SID ------------- ------------------------------------------------ login1 0xDB79ED7B6731CF4E8DC7DF02871E3E36
Zrób kopię zapasową bazy demonstracyjnej, używając zapytania przypominającego następujący skrypt:
BACKUP DATABASE [Demodb_15517] TO DISK = N'C:\SQLBackups\Demodb_15517.bak' WITH NOFORMAT, NOINIT, NAME = N'Demodb_15517 Full backup', SKIP, EWIND, NOUNLOAD, STATS = 10 GOUsuń bazę danych demonstracyjnych i
login1:DROP DATABASE demodb_15517 GO DROP login login1 GOZaloguj się do SQL Server jako .
login2Przywróć demonstracyjną bazę danych z kopii zapasowej, używając instrukcji przypominającej następujący skrypt:
USE [master] RESTORE DATABASE [Demodb_15517] FROM DISK = N'C:\SQLBackups\Demodb_15517.bak' WITH FILE = 1, MOVE N'Demodb_15517' TO N'C:\SQLBackups\Demodb_15517.mdf', MOVE N'Demodb_15517_log' TO N'C:\SQLBackups\\Demodb_155172_log.ldf', NOUNLOAD, STATS = 5 GOPonownie uruchom zapytanie 1 i zapytanie 2.
W Zapytaniu 1 sprawdź wartość
Owner_Namewartości wsys.databases. Wartość teraz odzwierciedlalogin2.SELECT NAME AS Database_Name, owner_sid, SUSER_SNAME(owner_sid) AS OwnerName FROM sys.databases WHERE NAME = N'Demodb_15517';Database_Name owner_sid OwnerName -------------- --------------------------------------- --------------------- Demodb_15517 0xD63086DD7277BC4EB88013D359AF73A6 login2W Zapytaniu 2 sprawdź wartość wartości
Owner_Namew tabelisys.database_principalsw bazie demonstracyjnej. Wartość teraz odzwierciedlaNULL.SELECT SUSER_SNAME(sid) AS Owner_Name, sid FROM Demodb_15517.sys.database_principals WHERE NAME = N'dbo';Owner_Name sid ------------------ ----------------------------------------------- NULL 0xDB79ED7B6731CF4E8DC7DF02871E3E36Uruchom procedurę zapisaną
testexec. Teraz powinieneś zobaczyć komunikat o błędzie "15517".USE Demodb_15517 GO EXEC dbo.testexec GOMsg 15517, Level 16, State 1, Procedure dbo.testexec, Line 0 [Batch Start Line 19] 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.Aby rozwiązać błąd, zmień dbo na poprawnego użytkownika (
login2) za pomocą następującego polecenia:ALTER AUTHORIZATION ON DATABASE:: Demodb_15517 TO [login2]Ponownie uruchom zapytanie 2 i sprawdź, czy użytkownicy DBO teraz decydują się na użytkownika login2.
Owner_Name SID ---------------------------------------------------------------- login2 0xD63086DD7277BC4EB88013D359AF73A6Spróbuj ponownie, aby uruchomić procedurę testową przechowywaną. Zauważ, że teraz działa pomyślnie.
USE Demodb_15517 GO EXEC dbo.testexec GO/* -- You get an output that resembles the following --------------------------------------------------------------------------------------------------------- Microsoft SQL Server 2019 (RTM-CU16-GDR) (KB5014353) - 15.0.4236.7 (X64) May 29 2022 15:55:47 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Windows 10 Enterprise 10.0 <X64> (Build 22621: ) (Hypervisor) */