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:
-
Opret certifikat i master
-
oprette et login fra det certifikat
-
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
-
Eksporter certifikatet til disk
-
Importer certifikatet til din brugerdatabase
nu kan vi afslutte
- opret bruger fra certifikatet
- giv tilladelse til bordet til den bruger
- fjern execute as-klausulen fra din lagrede procedure
- 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..