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:
-
Skapa certifikat i master
-
skapa en inloggning från det certifikatet
-
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
-
Exportera certifikatet till disk
-
Importera certifikatet till din användardatabas
nu kan vi slutföra
- skapa användare från certifikatet
- bevilja behörighet på bordet till den användaren
- ta bort execute as-satsen från din lagrade procedur
- 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...