sql >> Base de Datos >  >> RDS >> Sqlserver

Msg 4834 No tiene permiso para usar la declaración de carga masiva

Como dije en el comentario, los permisos de nivel de servidor se eliminan en el momento en que usa la suplantación.

Hay 2 formas de evitar esto:

La manera mala y rápida:

Establezca su base de datos de empuje en ON. Hará el trabajo. Pero si no comprende completamente lo que esto hace, entonces mi consejo sería NO hacer esto.

sin embargo, aquí está el código:

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

La forma buena pero más lenta

Esto es mucho más preciso y no tiene efectos secundarios de seguridad desagradables.

Lo que haces es que firmas tu procedimiento almacenado con un certificado. Crea un usuario a partir de ese certificado en la base de datos. Le otorga a ese usuario los permisos adecuados en su tabla en la base de datos. También crea un inicio de sesión desde el mismo certificado y otorga a ese inicio de sesión los permisos masivos.

Debido a que firma el proceso almacenado con ese certificado, cada vez que se ejecuta el sp, se ejecuta en el contexto de ese usuario e inicia sesión que se creó a partir de ese certificado.

los pasos son:

  1. Crear certificado en maestro

  2. crear un inicio de sesión a partir de ese certificado

  3. Otorgar permisos de administrador masivo a ese inicio de sesión

Ahora necesita exactamente el mismo certificado en su base de datos de usuario, por lo que debemos realizar algunos pasos adicionales

  1. Exportar el certificado al disco

  2. Importe el certificado a su base de datos de usuario

ahora podemos finalizar

  1. crear usuario a partir del certificado
  2. otorgar permiso en la tabla a ese usuario
  3. eliminar la cláusula ejecutar como de su procedimiento almacenado
  4. Firme su procedimiento almacenado con su certificado

aquí está el código:

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

Nota final:

¡Reemplace su directorio con una ruta en la que esté seguro de que la cuenta de servicio sql tiene permiso para escribir!

Asegúrese de eliminar esos certificados exportados después de haber terminado de configurar..