Както казах в коментара, разрешенията на ниво сървър се отнемат в момента, в който използвате имитация.
Има 2 начина за това:
Лошият и бърз начин:
Задайте надеждността на вашата база данни на ВКЛ. Ще свърши работата. Но ако не разбирате напълно какво прави това, тогава моят съвет е да НЕ правите това.
но ето кода:
ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;
Добрият, но по-бавен начин
Това е много по-прецизно и няма неприятни странични ефекти за сигурността.
Това, което правите, е да подпишете съхранената си процедура със сертификат. Вие създавате потребител от този сертификат в базата данни. Вие давате на този потребител правилните разрешения за вашата таблица в базата данни. Можете също така да създадете вход от същия сертификат и давате на този вход груповите разрешения.
Тъй като подписвате съхранената процедура с този сертификат, всеки път, когато sp се изпълни, той се изпълнява в контекста на този потребител и влизане, което е създадено от този сертификат.
стъпките са:
-
Създайте сертификат в master
-
създайте вход от този сертификат
-
Предоставете групови администраторски разрешения за това влизане
Сега имате нужда от абсолютно същия сертификат във вашата потребителска база данни, така че трябва да направим някои допълнителни стъпки
-
Експортирайте сертификата на диск
-
Импортирайте сертификата във вашата потребителска база данни
сега можем да финализираме
- създайте потребител от сертификата
- дайте разрешение за таблицата на този потребител
- премахнете клаузата execute as от вашата съхранена процедура
- Подпишете вашата съхранена процедура с вашия сертификат
ето кода:
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
Последна бележка:
Моля, заменете Вашата директория с път, където сте сигурни, че акаунтът на услугата sql има разрешение за запис!
Уверете се, че сте изтрили тези експортирани сертификати, след като приключите с настройката..