Нет разрешения на использование инструкции массовой загрузки

I am trying to insert an image into a VARBINARY(MAX) column. I get this error:

You do not have permission to use the bulk load statement.

Here is my code:

INSERT INTO Stickers (Name, Category, Gender, ImageData)
       SELECT   
           'Red Dress',
           'Dress',
           'F',
           BulkColumn FROM OPENROWSET(Bulk '\MacHomeDocumentsMMImagesreddress.png', 
                                      SINGLE_BLOB) AS BLOB

I realise there are a lot of answers on this topic but none of them have worked for me. This answer would be the easiest one for me to follow, however when using the object explorer and going into security > logins > right clicking my user does not reveal a «properties» menu item to go into.

I am using Sql Server Management Studio. Maybe I am not using the SQL Server version that I think I am, because none of the programmatic ways to set the permissions for my user worked. I think I am using SQL Server 2012. I probably have a few versions of SQL server on my computer. Clicking Help > About, it does show the logo «Microsoft SQL Server 2012» above the version information for various components (It does not show the version information for SQL Server here).

EDIT: Perhaps could someone please state the exact code I would use above my insert statement, given that the database is called MirrorMirror, the table is called Stickers, my user is called Amber, and my server is called gonskh1ou0.database.windows.net.

Студворк — интернет-сервис помощи студентам

Ошибка выполнения процедуры MY_PROC Microsoft OLE DB Provider for SQL Server: Нет разрешения на использование инструкции массовой загрузки.

Добавлено через 8 минут

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        ALTER PROCEDURE [dbo].[MY_PROC] 
    @FileName nvarchar(100),
    @IDXMLHandle int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
 
    DECLARE @x XML
    DECLARE @q nvarchar(MAX)
 
    SET @q= N'SELECT @x = CAST(T.X AS XML) FROM OPENROWSET(BULK ''' +  @FileName + ''', SINGLE_BLOB) T(X);'
    EXEC sys.sp_executesql @q, N'@x XML OUTPUT', @x OUTPUT;
 
    BEGIN TRY
        -- Подготовка дискриптора XML структуры
        EXEC sp_xml_preparedocument @IDXMLHandle OUTPUT, @IDXML
    END TRY
    BEGIN CATCH
        RETURN
    END CATCH
 
    --Уничтожение дискриптора XML структуры
    EXEC sp_xml_removedocument @IDXMLHandle
END

Я пытаюсь вставить изображения с помощью «bulk» в SQL Server 2012. Но, я заканчиваю сообщение об ошибке с указанием tha:

Msg 4834, Уровень 16, Состояние 1, Строка 2
У вас нет разрешения на использование инструкции массовой загрузки.

У меня есть доступ» sysadmin».

4 ответов


попробовать GRANT ADMINISTER BULK OPERATIONS TO [server_login]. Это разрешение уровня сервера, а не уровня базы данных. Это исправило аналогичную проблему для меня в прошлом (используя OPENROWSET, я считаю).


использовать master

go

GRANT администрировать массовые операции для shira


SQL Server также может вернуть эту ошибку, если учетная запись службы не имеет разрешения на чтение импортируемого файла. Убедитесь, что учетная запись имеет доступ на чтение к файлу. Например:

icacls D:ImportFiles /Grant "NT ServiceMSSQLServer":(OI)(CI)R

1

автор: Holistic Developer


использовать Master
GO

ALTER Server Role [bulkadmin] добавить участника [имя пользователя]
ИДТИ
Команде не удалось даже попробовал несколько параметров команды

мастер..sp_addsrvrolemember @loginame = n’username’, @rolename = N’bulkadmin’
ИДТИ
Командование прошло успешно..


Используя SQL Server 2016, я пытаюсь настроить пользователя, отличного от SA, для импорта файла. Код, который я выполняю, выглядит следующим образом:

EXECUTE AS USER = 'DataImports';

SELECT  CURRENT_USER;

EXEC xp_cmdshell 'TYPE myFileNameHere.txt'

BULK INSERT DataImports.staging_AddressBook
FROM 'myFileNameHere.txt'
WITH (DATAFILETYPE = 'char'
,     FIRSTROW = 2
,     FIELDTERMINATOR = ' '
,     ROWTERMINATOR = 'n');

Ошибка, которую я получаю:

Msg 4834, Level 16, State 1, Line 20
You do not have permission to use the bulk load statement.

Я подтвердил следующее:

  • У меня есть доступ к файлу в соответствии с требованиями пользователя. ТИП cmdshell возвращает ожидаемые строки. У меня нет проблем с доступом к файлам.
  • У меня есть INSERT разрешение на доступ к базе данных в целом.

Я тестировал, используя:

SELECT      
    [DatabaseUserName] = princ.[name],
    [PermissionType]   = perm.[permission_name],
    [PermissionState]  = perm.[state_desc]
FROM      
    sys.database_principals  princ
LEFT JOIN 
    sys.database_permissions perm ON perm.[grantee_principal_id] = princ.[principal_id]
WHERE      
    princ.[name] = 'DataImports';`

SQL Server — у вас нет разрешения на использование оператора массовой загрузки

  • У меня есть роль массового администратора

    SELECT
        r.name AS [RoleName],
        m.name AS [MemberName],
        CASE 
           WHEN m.name IS NOT NULL THEN 1 ELSE 0 
        END AS IsMember
    FROM      
        sys.server_principals r
    LEFT JOIN 
        sys.server_role_members rm ON (r.principal_id = rm.role_principal_id)
    LEFT JOIN 
        sys.server_principals m ON (rm.member_principal_id = m.principal_id)
    WHERE      
        r.type = 'R' AND m.name = 'Dataimports';
    

    SQL Server — у вас нет разрешения на использование оператора массовой загрузки

Я даже настроил пользователя как системного администратора (не является частью долгосрочного плана), но я все еще получаю сообщение об ошибке.

Это основные моменты, которые были выделены в других тикетах SO и общих поисках, которые я выполнял. Я могу импортировать таблицу как SA, но не как DataImports, несмотря на то, что конфигурация кажется правильной.

Это часть выполняемой работы, и в настоящее время нам нужно предоставить доступ SA только для чтения файла. С точки зрения безопасности это далеко не идеально, но я не могу понять, чего не хватает.

Любые предложения о том, что еще проверить, будут с благодарностью приняты — все основы, кажется, на месте.

Вопрос:

Я получаю эту ошибку независимо от того, что я пытаюсь.

У меня есть сохраненный proc с выполнением как:

CREATE PROCEDURE usp_myproc
WITH EXECUTE AS 'myuser'

В пределах этого п.п. У меня

EXEC('INSERT INTO ' + @tablename + '
SELECT col1, col2, col3
FROM OPENROWSET(
BULK '''+ @filepath +''',
FORMATFILE='''+ @formatfile +''',
FIRSTROW=2
)as t'
)

myuser имеет роль bulkadmin, чтение/запись, создание таблицы, вставка, выбор, выполнение, изменение разрешений. Некоторые из них могут не понадобиться, но это то, что я пробовал до сих пор. Что мне не хватает?

Спасибо.

Лучший ответ:

Как я уже сказал в комментарии, разрешения на уровне сервера удаляются в тот момент, когда вы используете олицетворение.

Есть два способа обойти это:

Плохой и быстрый способ:

Установите для своей базы данных значение ON. Он выполнит свою работу. Но если вы не полностью понимаете, что это делает, тогда мой совет должен был НЕ делать этого.

однако, вот код:

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;

Хороший, но более медленный способ

Это намного точнее и не имеет никаких неприятных побочных эффектов безопасности.

Что вы делаете, так это то, что вы подписываете свою хранимую процедуру сертификатом. Вы создаете пользователя из этого сертификата в databasse. Вы даете этому пользователю правильные разрешения для вашей таблицы в базе данных. Вы также создаете Логин из того же сертификата и предоставляете им входные разрешения.

Поскольку вы подписываете сохраненный процесс с этим сертификатом, каждый раз, когда sp запускается, он выполняется в контексте этого пользователя и регистрируется там, где он создан из этого сертификата.

выполняются следующие шаги:

  • Создать сертификат в главном

  • создать логин из этого сертификата

  • Предоставление прав администратора для этого входа

Теперь вам нужен точно такой же сертификат в вашей пользовательской базе данных, поэтому у нас есть несколько дополнительных шагов для выполнения

  • Экспорт сертификата на диск

  • Импортируйте сертификат в свою пользовательскую базу данных

теперь мы можем завершить работу

  • создать пользователя из сертификата
  • предоставить разрешение для таблицы этому пользователю
  • удалить как выполняемое условие из хранимой процедуры
  • Подпишите свою хранимую процедуру с сертификатом

вот код:

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

Попробуйте предоставить следующие разрешения на уровне сервера:

    GRANT ADMINISTER BULK OPERATIONS TO [server_login]

Кроме того, существует еще один SO, связанный только с этим, пожалуйста, обратитесь к этому.

Понравилась статья? Поделить с друзьями:

Новое и полезное:

  • Нет звука на ноутбуке что делать пошаговая инструкция
  • Нет должностной инструкции чем это грозит предприятию
  • Нет должностной инструкции хотят уволить
  • Несуществующее животное инструкция для детей
  • Несушка прикормка для кур инструкция по применению

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии