Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Msg 4834 Você não tem permissão para usar a instrução de carregamento em massa


Como eu disse no comentário, as permissões no nível do servidor são removidas no momento em que você usa a representação.

Existem 2 maneiras de contornar isso:

A maneira ruim e rápida:

Defina seu banco de dados confiável para ON. Ele vai fazer o trabalho. Mas se você não entender completamente o que isso faz, meu conselho seria NÃO fazer isso.

no entanto, aqui está o código:
ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

A maneira boa, mas mais lenta

Isso é muito mais preciso e não tem efeitos colaterais desagradáveis ​​de segurança.

O que você faz é assinar seu procedimento armazenado com um certificado. Você cria um usuário desse certificado no banco de dados. Você concede a esse usuário as permissões apropriadas em sua tabela no banco de dados. Você também cria um logon do mesmo certificado e concede a esse logon as permissões em massa.

Como você assina o proc armazenado com esse certificado, toda vez que o sp é executado, ele é executado no contexto desse usuário e faz o login que foi criado a partir desse certificado.

os passos são:

  1. Criar certificado no mestre

  2. crie um login a partir desse certificado

  3. Conceda permissões de administrador em massa para esse login

Agora você precisa exatamente do mesmo certificado em seu banco de dados de usuário, portanto, temos algumas etapas extras a fazer

  1. Exportar o certificado para o disco

  2. Importe o certificado para o banco de dados do usuário

agora podemos finalizar
  1. criar usuário a partir do certificado
  2. conceda permissão na tabela a esse usuário
  3. remova a cláusula execute as do seu procedimento armazenado
  4. Assine seu procedimento armazenado com seu certificado

aqui está o 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:

Por favor, substitua Seu diretório por um caminho onde você tenha certeza de que a conta de serviço sql tem permissão para gravar!

Certifique-se de excluir esses certificados exportados depois de configurar.