Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Msg 4834 Anda tidak memiliki izin untuk menggunakan pernyataan beban massal

Seperti yang saya katakan di komentar, izin tingkat server dicabut saat Anda menggunakan peniruan identitas.

Ada 2 cara untuk mengatasinya:

Cara yang buruk dan cepat:

Setel basis data Anda ke ON. Ini akan menyelesaikan pekerjaan. Tetapi jika Anda tidak sepenuhnya memahami apa fungsinya, maka saran saya adalah JANGAN lakukan ini.

namun, ini kodenya:

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

Cara yang bagus tapi lebih lambat

Ini jauh lebih tepat dan tidak memiliki efek samping keamanan yang buruk.

Apa yang Anda lakukan adalah menandatangani prosedur tersimpan Anda dengan sertifikat. Anda membuat pengguna dari sertifikat itu di database. Anda memberi pengguna itu izin yang tepat pada tabel Anda di database. Anda juga membuat Login dari sertifikat yang sama dan memberikan login tersebut izin massal.

Karena Anda menandatangani proc yang disimpan dengan sertifikat itu, setiap sp dijalankan, itu dijalankan dalam konteks pengguna itu dan login yang dibuat dari sertifikat itu.

langkah-langkahnya adalah:

  1. Buat sertifikat di master

  2. buat login dari sertifikat itu

  3. Berikan izin admin Massal untuk login tersebut

Sekarang Anda memerlukan sertifikat yang sama persis di basis data pengguna Anda, jadi kami memiliki beberapa langkah tambahan yang harus dilakukan

  1. Ekspor sertifikat ke disk

  2. Impor sertifikat ke dalam basis data pengguna Anda

sekarang kita bisa menyelesaikan

  1. buat pengguna dari sertifikat
  2. memberikan izin di atas meja kepada pengguna tersebut
  3. hapus klausa eksekusi sebagai dari prosedur tersimpan Anda
  4. Tanda tangani prosedur tersimpan Anda dengan sertifikat Anda

ini kodenya:

USE master
go
CREATE CERTIFICATE BulkInsertCert
   ENCRYPTION BY PASSWORD = 'NicePassword!0'
   WITH SUBJECT = 'Gives Bulk Insert Privilegde'
go

CREATE LOGIN BulkInsert_CertLogin FROM CERTIFICATE BulkInsertCert
go


GRANT ADMINISTER BULK OPERATIONS TO BulkInsert_CertLogin
go


BACKUP CERTIFICATE BulkInsertCert TO FILE = '[your directory]\BulkInsertCert.cer'
WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk' ,
                  ENCRYPTION BY PASSWORD = 'EvenNicerPassword!0',
                  DECRYPTION BY PASSWORD = 'NicePassword!0')
go

USE [YourDatabase]
CREATE CERTIFICATE BulkInsertCert FROM FILE = '[your directory]\BulkInsertCert.cer'
WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk',
                  DECRYPTION BY PASSWORD = 'EvenNicerPassword!0',
                  ENCRYPTION BY PASSWORD = 'TheVeryBestPasswordThereIs!0')
go
--NOW DELETE THE CERTIFICATES FROM DISK

CREATE USER BulkInsert_CertUser FOR CERTIFICATE BulkInsertCert
go
GRANT ALTER, INSERT ON [YourTable] TO BulkInsert_CertUser
go


ALTER PROCEDURE usp_myproc
AS
EXEC('INSERT INTO ' + @tablename + '
            SELECT col1, col2, col3
            FROM OPENROWSET( 
              BULK '''+ @filepath +''',
              FORMATFILE='''+ @formatfile +''',
              FIRSTROW=2
            )as t'
          )
-- Sign the test procedure each time you have changed it.
ADD SIGNATURE TO usp_myproc BY CERTIFICATE BulkInsertCert
    WITH PASSWORD = 'TheVeryBestPasswordThereIs!0'
go

Catatan terakhir:

Silakan ganti direktori Anda dengan jalur di mana Anda yakin bahwa akun layanan sql telah mendapat izin untuk menulis!

Pastikan Anda menghapus sertifikat yang diekspor tersebut setelah Anda selesai menyiapkan..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa CTE (Common Table Expressions) dalam beberapa kasus memperlambat kueri dibandingkan dengan tabel sementara di SQL Server

  2. Mengonversi hasil Pilih menjadi skrip Sisipkan - SQL Server

  3. Memperkenalkan Fitur Baru - Laporan Pertumbuhan Database Cloud Spotlight

  4. Cara Mengembalikan Semua Batasan CHECK yang Tidak Tepercaya di SQL Server (Contoh T-SQL)

  5. Kolom teks tidak menyimpan lebih dari 8000 karakter