MSSQLSERVER_15517
Berlaku untuk: SQL Server
Detail
Atribut | Nilai |
---|---|
Nama Produk | SQL Server |
ID Peristiwa | 15517 |
Sumber Kejadian | MSSQLSERVER |
Komponen | SQLEngine |
Nama Simbolis | SEC_CANNOTEXECUTEASUSER |
Teks Pesan | Tidak dapat dijalankan sebagai prinsipal database karena "prinsipal" utama tidak ada, jenis prinsipal ini tidak dapat ditiru, atau Anda tidak memiliki izin. |
Penjelasan
Kesalahan ini biasanya terjadi karena Microsoft SQL Server tidak bisa mendapatkan informasi tentang konteks eksekusi prinsipal yang ditentukan dalam pernyataan pengguna atau modul dengan menggunakan EXECUTE AS
pernyataan .
Pengidentifikasi Keamanan (SID) informasi masuk Anda secara otomatis disimpan saat Anda membuat database pada instans SQL Server sebagai pemilik database di baris database yang sesuai dalam sys.databases
tabel dan untuk dbo
item pengguna dalam tabel dalam sys.database_principals
database.
Pernyataan atau modul yang menggunakan EXECUTE AS OWNER
klausul akan berfungsi seperti yang diharapkan jika entri SID yang disimpan untuk pengguna dbo valid.
Catatan
Masalah ini dapat terjadi untuk prinsipal apa pun yang digunakan dalam EXECUTE AS
pernyataan dan yang tidak ada di server tempat database dipulihkan.
Berikut adalah beberapa skenario umum yang dapat menyebabkan masalah ini terjadi:
Anda memulihkan database pada instans server yang sama di mana cadangan awalnya diambil, tetapi prinsipal SQL Server yang membuat database tidak lagi valid karena alasan tertentu. Contohnya:
- Login autentikasi SQL Server dihapus.
- Login autentikasi Windows tidak lagi untuk pengguna yang valid di Direktori Aktif karena karyawan meninggalkan perusahaan.
Anda memulihkan database di server yang berbeda dari instans tempat cadangan awalnya diambil, tetapi prinsipal SQL Server yang membuat database bukan prinsipal yang valid di server baru.
- Jika pengguna adalah login SQL Server, prinsipal mungkin ada di server target atau tujuan tetapi nilainya
sid
akan berbeda. - Jika pengguna adalah login Windows, login Windows tidak ada di server target atau tidak lagi valid.
- Jika pengguna adalah login SQL Server, prinsipal mungkin ada di server target atau tujuan tetapi nilainya
Pengguna atau aplikasi yang menjalankan prosedur, fungsi, atau pemicu yang disimpan tidak memiliki izin yang diperlukan untuk meniru prinsipal yang ditentukan dalam EXECUTE AS
pernyataan.
Tindakan pengguna
Gunakan nama prinsipal yang ada atau berikan izin IMPERSONATE pada prinsipal tersebut kepada pengguna yang diperlukan.
Untuk mengatasi masalah yang terjadi karena kesalahan pengguna dbo yang tidak valid, ubah dbo_User
nilai menjadi login yang valid di server Anda dengan menjalankan perintah berikut:
ALTER AUTHORIZATION ON DATABASE:: DBName TO [NewLogin]
Contoh skenario
Buat dua prinsipal sementara:
CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb'; CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b';
Tambahkan login ini ke peran sysadmin (hanya untuk demonstrasi).
Masuk ke instans SQL Server Anda dengan menggunakan
login1
.Buat database demonstrasi dan prosedur tersimpan yang dinamai
testexec
dengan menjalankan skrip berikut:CREATE DATABASE Demodb_15517 GO USE Demodb_15517 GO CREATE procedure [dbo].[testexec] WITH EXECUTE AS owner AS SELECT @@VERSION GO EXEC dbo.testexec GO
Jalankan kueri berikut, dan periksa apakah
sid
nilai menyelesaikan proses masuk yang valid:Kueri 1: Periksa nilai
Owner_Name
nilai dalam 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 login1
Kueri 2: Periksa
Owner_Name
nilai dalam tabel dalamsys.database_principals
database demonstrasi:SELECT SUSER_SNAME(sid) AS Owner_Name, sid FROM Demodb_15517.sys.database_principals WHERE NAME = N'dbo';
Owner_Name SID ------------- ------------------------------------------------ login1 0xDB79ED7B6731CF4E8DC7DF02871E3E36
Cadangkan database demonstrasi dengan menggunakan kueri yang menyerupan skrip berikut:
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 GO
Hilangkan database demonstrasi dan
login1
:DROP DATABASE demodb_15517 GO DROP login login1 GO
Masuk ke SQL Server sebagai
login2
.Pulihkan database demonstrasi dari cadangan dengan menggunakan pernyataan yang menyerupan skrip berikut:
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 GO
Jalankan ulang Kueri 1 dan Kueri 2.
Di Kueri 1, periksa nilai nilai
Owner_Name
disys.databases
. Nilai sekarang mencerminkanlogin2
.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 login2
Di Kueri 2, periksa nilai
Owner_Name
nilai dalam tabel dalamsys.database_principals
database demonstrasi. Nilai sekarang mencerminkanNULL
.SELECT SUSER_SNAME(sid) AS Owner_Name, sid FROM Demodb_15517.sys.database_principals WHERE NAME = N'dbo';
Owner_Name sid ------------------ ----------------------------------------------- NULL 0xDB79ED7B6731CF4E8DC7DF02871E3E36
Jalankan prosedur tersimpan
testexec
. Anda sekarang akan melihat pesan kesalahan "15517".USE Demodb_15517 GO EXEC dbo.testexec GO
Msg 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.
Untuk mengatasi kesalahan, ubah dbo menjadi pengguna yang valid (
login2
) dengan menggunakan perintah berikut:ALTER AUTHORIZATION ON DATABASE:: Demodb_15517 TO [login2]
Jalankan ulang Kueri 2 dan verifikasi bahwa pengguna dbo sekarang menyelesaikan ke pengguna login2.
Owner_Name SID ---------------------------------------------------------------- login2 0xD63086DD7277BC4EB88013D359AF73A6
Coba lagi untuk menjalankan prosedur tersimpan pengujian. Perhatikan bahwa sekarang berjalan dengan sukses.
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) */