Настроить неограниченное делегирование для BULK INSERT

12

У меня есть пара узлов Microsoft SQL Server 2016 в группе доступности всегда. Я пытаюсь выполнить BULK INSERT(используя запрос SQL Server 2016 Management Studio) файл, расположенный в отказоустойчивом кластере файлового сервера Windows Server 2016, но получаю следующую ошибку:

Сообщение 4861, уровень 16, состояние 1
Не удается выполнить массовую загрузку, поскольку файл "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt" не может быть открыт. Код ошибки операционной системы 5 (доступ запрещен.).

Это произойдет независимо от того, использую я имя активного узла ( nas2.my.domain) или прослушиватель отказоустойчивого кластера ( nas.my.domain).

После осмотра я обнаружил, что это связано с тем, что SQL Server не может выдать себя за учетную запись пользователя, с которой я связан из-за нюансов BULK INSERT.

Если вы подключаетесь к SQL Server с использованием аутентификации Windows, учетная запись службы SQL Server пытается выдать себя за вашу учетную запись при подключении к файловому серверу. Если вы подключаетесь с использованием аутентификации SQL Server, он подключается к файловому серверу в качестве учетной записи службы SQL Server.

Если делегирование и олицетворение не настроены должным образом (состояние по умолчанию), служба SQL Server не сможет олицетворять вашу учетную запись пользователя и обратится к попытке подключения к файловому серверу в качестве анонимного пользователя.

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

Я попытался следовать инструкциям в руководстве thesqldude , но он все еще не работает.

База данных, к которой я пытаюсь обратиться, BULK INSERTне является частью группы доступности, поэтому должен быть релевантным только узел MSSQL1. Файловый сервер был активен на узле NAS2. Проверка журнала событий на файловом сервере действительно показывает, что он все еще страдает от этой проблемы, и SQL Server пытается пройти проверку подлинности на файловом сервере как анонимный пользователь, а не выдавать себя за мою учетную запись.

Кто-нибудь знает, что идет не так? Или что-то изменилось в SQL Server 2016, чтобы сделать эти руководства устаревшими?

Я могу подтвердить, что этот объект групповой политики был применен к MSSQL1 с помощью gpresult.exe /R, а затем узлы SQL и Файловый сервер были перезагружены, чтобы обеспечить очистку любых кэшей.

Мух Фуген
источник
1
Два вопроса: 1) пытались ли вы включить свою личную учетную запись домена Windows для делегирования ?, 2) когда вы подключаетесь к SQL Server через SSMS, регистрируетесь ли вы на сервере (т. Е. На удаленном рабочем столе), на котором работает SQL Server и подключается локально, или вошли на свою рабочую станцию ​​и подключились к SQL Server удаленно? Если вы не пытались войти на сервер напрямую и подключиться локально через SSMS, попробуйте это. Если вы еще не пытались включить учетную запись домена для делегирования, попробуйте это.
Соломон Руцкий,

Ответы:

1

Ваша конфигурация выглядит солидно. SPN и Делегирование настроены так, как я бы сделал это сам.

Единственное, что вы не объяснили - это права доступа к файлу / общему ресурсу. Это где мое решение вступает.

Решение 1 (Личный кабинет)

  1. Убедитесь, что вашей учетной записи разрешен доступ к файлу на общем файловом сервере.
    • Ваша личная учетная запись требует как минимум разрешений READ на уровне разрешений общего ресурса, или в большинстве случаев вы можете видеть, что КАЖДЫЙ имеет разрешение READ.
    • Ваша личная учетная запись должна иметь как минимум права READ на уровне разрешений файла
    • Проверьте наследование разрешений на уровне файла для этого одного файла
      • Перезагрузите SQL Server после изменения прав доступа к файлу или отключите службу SQL Server.
    • Либо: войдите на SQL Server под своей личной учетной записью, подключитесь к общему ресурсу и откройте файл.
  2. Откройте SSMS с вашей личной учетной записью.
  3. Откройте соединение с вашим экземпляром SQL Server с помощью аутентификации Windows.
    • Убедитесь, что вы подключены к своему экземпляру с учетной записью службы SQL Server с помощью сценария, который вы использовали ранее.
  4. Выполните импорт с помощью BULK INSERT

Решение 2 (учетная запись службы SQL Server)

  1. Убедитесь, что учетной записи службы SQL Server разрешен доступ к файлу в общей папке файлового сервера.
    • то служба SQL Server потребность учетной записи в разрешениях наименее READ на уровне разрешения акций или в большинстве случаев вы можете увидеть , что каждый имеет разрешение на чтение.
    • то служба SQL Server потребность учетной записи в разрешениях наименее READ на уровне разрешения файла
    • Проверьте наследование разрешений на уровне файла для этого одного файла
      • Перезагрузите SQL Server после изменения прав доступа к файлу или отключите службу SQL Server.
    • Либо: войдите на SQL Server с учетной записью службы SQL Server, подключитесь к общему ресурсу и откройте файл.
  2. Откройте SSMS с учетной записью службы SQL Server .
    • Runas: your_domain \ SQL_Server_service_account
    • Введите пароль
  3. Откройте соединение с вашим SQL Server с помощью аутентификации Windows.
    • Убедитесь, что вы подключены к своему экземпляру с учетной записью службы SQL Server с помощью сценария, который вы использовали ранее.
  4. Выполните импорт с помощью BULK INSERT

БОЛЬШОЙ ВСТАВИТЬ разрешения

Делегирование учетной записи (олицетворение)

Если пользователь использует имя входа SQL Server, используется профиль безопасности учетной записи процесса SQL Server. Вход в систему с использованием аутентификации SQL Server не может быть аутентифицирован за пределами компонента Database Engine. Поэтому, когда команда BULK INSERT инициируется входом в систему с использованием проверки подлинности SQL Server, подключение к данным выполняется с использованием контекста безопасности учетной записи процесса SQL Server ( учетной записи, используемой службой компонента SQL Server Database Engine ). Для успешного чтения исходных данных необходимо предоставить учетной записи, используемой компонентом SQL Server Database Engine, доступ к исходным данным. Напротив, если пользователь SQL Server входит в систему с использованием проверки подлинности Windows, пользователь может читать только те файлы, к которым может получить доступ учетная запись пользователя, независимо от профиля безопасности процесса SQL Server.

Ссылка: BULK INSERT (Transact-SQL)

Джон ака hot2use
источник
0

По опыту делегирования учетной записи службы SQL Server необходимы соответствующие разрешения для общего ресурса, к которому она пытается получить доступ от вашего имени. Вы корректировали эти разрешения? Я думаю, что только для чтения будет достаточно заранее.

Крис Лумна
источник