Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Msg 4834 Нямате разрешение да използвате оператора за групово зареждане

Както казах в коментара, разрешенията на ниво сървър се отнемат в момента, в който използвате имитация.

Има 2 начина за това:

Лошият и бърз начин:

Задайте надеждността на вашата база данни на ВКЛ. Ще свърши работата. Но ако не разбирате напълно какво прави това, тогава моят съвет е да НЕ правите това.

но ето кода:

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

Добрият, но по-бавен начин

Това е много по-прецизно и няма неприятни странични ефекти за сигурността.

Това, което правите, е да подпишете съхранената си процедура със сертификат. Вие създавате потребител от този сертификат в базата данни. Вие давате на този потребител правилните разрешения за вашата таблица в базата данни. Можете също така да създадете вход от същия сертификат и давате на този вход груповите разрешения.

Тъй като подписвате съхранената процедура с този сертификат, всеки път, когато sp се изпълни, той се изпълнява в контекста на този потребител и влизане, което е създадено от този сертификат.

стъпките са:

  1. Създайте сертификат в master

  2. създайте вход от този сертификат

  3. Предоставете групови администраторски разрешения за това влизане

Сега имате нужда от абсолютно същия сертификат във вашата потребителска база данни, така че трябва да направим някои допълнителни стъпки

  1. Експортирайте сертификата на диск

  2. Импортирайте сертификата във вашата потребителска база данни

сега можем да финализираме

  1. създайте потребител от сертификата
  2. дайте разрешение за таблицата на този потребител
  3. премахнете клаузата execute as от вашата съхранена процедура
  4. Подпишете вашата съхранена процедура с вашия сертификат

ето кода:

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 има разрешение за запис!

Уверете се, че сте изтрили тези експортирани сертификати, след като приключите с настройката..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дайте разрешение SELECT за изглед, но не и за подлежащи обекти

  2. Разлика между извършено четене и повторяемо четене

  3. Генериране на XML файл от SQL Server 2008

  4. SQL заявка; хоризонтално към вертикално

  5. codeigniter и odbc връзки