sql >> Databasteknik >  >> RDS >> Sqlserver

Msg 4834 Du har inte behörighet att använda bulk load-satsen

Som jag sa i kommentaren, tas behörigheter på servernivå bort i det ögonblick du använder identitetsstöld.

Det finns två sätt att komma runt detta:

Det dåliga och snabba sättet:

Ställ in din databas drivvärd till PÅ. Det kommer att få jobbet gjort. Men om du inte helt förstår vad detta gör, så skulle mitt råd vara att INTE göra detta.

men här är koden:

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

Det bra men långsammare sättet

Detta är mycket mer exakt och har inga otäcka säkerhetsbiverkningar.

Det du gör är att du signerar din lagrade procedur med ett certifikat. Du skapar en användare från det certifikatet i databasen. Du ger den användaren rätt behörigheter för din tabell i databasen. Du skapar också en inloggning från samma certifikat och ger den inloggningen bulkbehörigheter.

Eftersom du signerar den lagrade processen med det certifikatet, så körs det varje gång sp:t körs i användarens sammanhang och loggar in som skapades från det certifikatet.

stegen är:

  1. Skapa certifikat i master

  2. skapa en inloggning från det certifikatet

  3. Bevilja massadministratörsbehörigheter till den inloggningen

Nu behöver du exakt samma certifikat i din användardatabas så vi har några extra steg att göra

  1. Exportera certifikatet till disk

  2. Importera certifikatet till din användardatabas

nu kan vi slutföra

  1. skapa användare från certifikatet
  2. bevilja behörighet på bordet till den användaren
  3. ta bort execute as-satsen från din lagrade procedur
  4. Underteckna din lagrade procedur med ditt certifikat

här är koden:

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

Slutanmärkning:

Vänligen ersätt din katalog med en sökväg där du är säker på att sql-tjänstkontot har behörighet att skriva!

Se till att du tar bort de exporterade certifikaten efter att du har gjort installationen...



  1. misslyckas med att ladda ROracle:det går inte att ladda delat objekt ROracle.so:libclntsh.so.11.1 Ingen sådan fil eller katalog

  2. MSSQL Reguljärt uttryck

  3. Vad är det förväntade beteendet för flera set-returnerande funktioner i SELECT-satsen?

  4. T-SQL trim   (och andra icke-alfanumeriska tecken)