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:
-
Criar certificado no mestre
-
crie um login a partir desse certificado
-
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
-
Exportar o certificado para o disco
-
Importe o certificado para o banco de dados do usuário
agora podemos finalizar
- criar usuário a partir do certificado
- conceda permissão na tabela a esse usuário
- remova a cláusula execute as do seu procedimento armazenado
- 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.