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 :
-
Créer un certificat dans le maître
-
créer une connexion à partir de ce certificat
-
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
-
Exporter le certificat sur disque
-
Importez le certificat dans votre base de données utilisateur
maintenant nous pouvons finaliser
- créer un utilisateur à partir du certificat
- accorder l'autorisation sur la table à cet utilisateur
- supprimer la clause execute as de votre procédure stockée
- 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.