Bagikan melalui


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.

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

  1. Buat dua prinsipal sementara:

    CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb';
    CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b';
    
  2. Tambahkan login ini ke peran sysadmin (hanya untuk demonstrasi).

  3. Masuk ke instans SQL Server Anda dengan menggunakan login1.

  4. 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
    
  5. 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 dalam sys.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
      
  6. 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
    
  7. Hilangkan database demonstrasi dan login1:

    DROP DATABASE demodb_15517
    GO
    DROP login login1
    GO
    
  8. Masuk ke SQL Server sebagai login2.

  9. 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 
    
  10. Jalankan ulang Kueri 1 dan Kueri 2.

  11. Di Kueri 1, periksa nilai nilai Owner_Name di sys.databases. Nilai sekarang mencerminkan login2.

    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
    
  12. Di Kueri 2, periksa nilai Owner_Name nilai dalam tabel dalam sys.database_principals database demonstrasi. Nilai sekarang mencerminkan NULL.

    SELECT SUSER_SNAME(sid) AS Owner_Name, sid
    FROM Demodb_15517.sys.database_principals
    WHERE NAME = N'dbo';
    
    Owner_Name         sid 
      ------------------ -----------------------------------------------
    NULL               0xDB79ED7B6731CF4E8DC7DF02871E3E36 
    
  13. 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. 
    
  14. Untuk mengatasi kesalahan, ubah dbo menjadi pengguna yang valid (login2) dengan menggunakan perintah berikut:

    ALTER AUTHORIZATION ON DATABASE:: Demodb_15517 TO [login2]   
    
  15. Jalankan ulang Kueri 2 dan verifikasi bahwa pengguna dbo sekarang menyelesaikan ke pengguna login2.

    Owner_Name          SID
    ---------------------------------------------------------------- 
    login2              0xD63086DD7277BC4EB88013D359AF73A6 
    
  16. 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) 
    */ 
    

Lihat Juga

Menyalin database ke server lain

Mentransfer login dan kata sandi antar instans