Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Msg 4834 Sie sind nicht berechtigt, die Massenladeanweisung zu verwenden

Wie ich im Kommentar sagte, werden Berechtigungen auf Serverebene in dem Moment entfernt, in dem Sie Identitätswechsel verwenden.

Es gibt zwei Möglichkeiten, dies zu umgehen:

Der schlechte und schnelle Weg:

Setzen Sie Ihre Datenbank Thrustworthy auf ON. Es wird die Arbeit erledigen. Aber wenn Sie nicht vollständig verstehen, was dies bewirkt, würde ich Ihnen raten, dies NICHT zu tun.

Hier ist jedoch der Code:

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

Der gute, aber langsamere Weg

Das ist viel präziser und hat keine unangenehmen Sicherheitsnebenwirkungen.

Was Sie tun, ist, dass Sie Ihre gespeicherte Prozedur mit einem Zertifikat signieren. Sie erstellen einen Benutzer aus diesem Zertifikat in der Datenbank. Sie geben diesem Benutzer die richtigen Berechtigungen für Ihre Tabelle in der Datenbank. Sie erstellen auch ein Login aus demselben Zertifikat und gewähren diesem Login die Bulk-Berechtigungen.

Da Sie den gespeicherten Prozess mit diesem Zertifikat signieren, wird der SP jedes Mal, wenn er ausgeführt wird, im Kontext dieses Benutzers ausgeführt und meldet sich an, der von diesem Zertifikat erstellt wurde.

die Schritte sind:

  1. Zertifikat im Master erstellen

  2. aus diesem Zertifikat ein Login erstellen

  3. Gewähren Sie diesem Login Bulk-Admin-Berechtigungen

Jetzt benötigen Sie genau dasselbe Zertifikat in Ihrer Benutzerdatenbank, also müssen wir einige zusätzliche Schritte ausführen

  1. Exportieren Sie das Zertifikat auf die Festplatte

  2. Importieren Sie das Zertifikat in Ihre Benutzerdatenbank

jetzt können wir abschließen

  1. Benutzer aus dem Zertifikat erstellen
  2. diesem Benutzer die Berechtigung für die Tabelle erteilen
  3. Entfernen Sie die Klausel execute as aus Ihrer gespeicherten Prozedur
  4. Signieren Sie Ihre gespeicherte Prozedur mit Ihrem Zertifikat

Hier ist der Code:

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

Schlussbemerkung:

Bitte ersetzen Sie Ihr Verzeichnis durch einen Pfad, bei dem Sie sicher sind, dass das SQL-Dienstkonto Schreibrechte hat!

Stellen Sie sicher, dass Sie diese exportierten Zertifikate löschen, nachdem Sie die Einrichtung abgeschlossen haben..