Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Msg 4834 Vous n'êtes pas autorisé à utiliser l'instruction de chargement en bloc

Comme je l'ai dit dans le commentaire, les autorisations au niveau du serveur sont supprimées dès que vous utilisez l'emprunt d'identité.

Il y a 2 façons de contourner cela :

La méthode la plus mauvaise et la plus rapide :

Réglez votre base de données sur ON. Il fera le travail. Mais si vous ne comprenez pas entièrement ce que cela fait, alors mon conseil serait de NE PAS le faire.

cependant, voici le code :

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

Le bon moyen, mais plus lent

C'est beaucoup plus précis et n'a pas d'effets secondaires désagréables sur la sécurité.

Ce que vous faites, c'est que vous signez votre procédure stockée avec un certificat. Vous créez un utilisateur à partir de ce certificat dans la base de données. Vous donnez à cet utilisateur les autorisations appropriées sur votre table dans la base de données. Vous créez également une connexion à partir du même certificat et accordez à cette connexion les autorisations groupées.

Parce que vous signez la procédure stockée avec ce certificat, chaque fois que le sp est exécuté, il est exécuté dans le contexte de cet utilisateur et de la connexion qui a été créée à partir de ce certificat.

les étapes sont :

  1. Créer un certificat dans le maître

  2. créer une connexion à partir de ce certificat

  3. Accordez des autorisations d'administration groupées à cette connexion

Maintenant, vous avez besoin d'exactement le même certificat dans votre base de données d'utilisateurs, nous avons donc quelques étapes supplémentaires à faire

  1. Exporter le certificat sur disque

  2. Importez le certificat dans votre base de données utilisateur

maintenant nous pouvons finaliser

  1. créer un utilisateur à partir du certificat
  2. accorder l'autorisation sur la table à cet utilisateur
  3. supprimer la clause execute as de votre procédure stockée
  4. Signez votre procédure stockée avec votre certificat

voici le 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

Remarque finale :

Veuillez remplacer votre répertoire par un chemin dans lequel vous êtes sûr que le compte de service sql est autorisé à écrire !

Assurez-vous de supprimer ces certificats exportés après avoir terminé la configuration.