sql >> Database teknologi >  >> RDS >> Sqlserver

Msg 4834 Du har ikke tilladelse til at bruge bulk load-erklæringen

Som jeg sagde i kommentaren, fjernes tilladelser på serverniveau i det øjeblik, du bruger efterligning.

Der er 2 måder at undgå dette på:

Den dårlige og hurtige måde:

Indstil din databases thrustworthy til ON. Det vil få arbejdet gjort. Men hvis du ikke helt forstår, hvad dette gør, så vil mit råd være, at du IKKE gør dette.

men her er koden:

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

Den gode, men langsommere måde

Dette er meget mere præcist og har ingen grimme sikkerhedsmæssige bivirkninger.

Det du gør er, at du underskriver din lagrede procedure med et certifikat. Du opretter en bruger fra det certifikat i databasen. Du giver den bruger de korrekte tilladelser på din tabel i databasen. Du opretter også et login fra det samme certifikat og giver dette login massetilladelser.

Fordi du signerer den lagrede proc med det certifikat, udføres hver gang sp'en udføres i konteksten af ​​den bruger og logger ind, som blev oprettet fra det certifikat.

trinnene er:

  1. Opret certifikat i master

  2. oprette et login fra det certifikat

  3. Giv masseadministratortilladelser til dette login

Nu skal du bruge præcis det samme certifikat i din brugerdatabase, så vi har nogle ekstra trin at gøre

  1. Eksporter certifikatet til disk

  2. Importer certifikatet til din brugerdatabase

nu kan vi afslutte

  1. opret bruger fra certifikatet
  2. giv tilladelse til bordet til den bruger
  3. fjern execute as-klausulen fra din lagrede procedure
  4. Underskriv din lagrede procedure med dit certifikat

her er 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

Sidste bemærkning:

Erstat venligst dit bibliotek med en sti, hvor du er sikker på, at sql-tjenestekontoen har tilladelse til at skrive!

Sørg for, at du sletter de eksporterede certifikater, når du har færdiggjort opsætningen..



  1. Hvad er det kulturneutrale datoformat for SQL Server

  2. CONTAINS virker ikke med Oracle Text

  3. PostgreSQL kontroller, om array indeholder et element fra venstre array

  4. MySQL:Overførsel af procedureparametre til EXECUTE USING-sætning