#sql-server
#sql-сервер
Вопрос:
Я хотел бы предоставить не-администратору возможность создавать папки на локальном жестком диске SQL server, используя xp_create_subdir. Причина — необходимо создать структуру папок, чтобы производственное оборудование могло передавать по FTP большие файлы. Метаданные для файлов хранятся в SQL.
Сервер — SQL 2016 Express. Операционная система — Windows 10 Pro.
Я нашел множество объяснений того, как заставить это работать, но не могу понять, чего мне не хватает. Используя учетную запись SA, я создал хранимую процедуру, подобную этой:
use [DBname]
CREATE PROCEDURE dbo.usp_CreateDirectory
@directoryFullPath varchar(500)
WITH EXECUTE AS owner
AS
BEGIN
SET NOCOUNT ON;
EXEC master.dbo.xp_create_subdir @directoryFullPath;
END
GO
GRANT EXECUTE ON dbo.usp_CreateDirectory TO [TestUser]
GO
Код для запуска хранимой процедуры:
DECLARE @RC int
DECLARE @directoryFullPath varchar(500)
set @directoryFullPath = 'd:FTP_Root2020822'
EXECUTE @RC = dbo.usp_CreateDirectory
@directoryFullPath
GO
В Windows я предоставил NT Service MSSQL $ {InstanceName} полный доступ к d:FTP_Root
Чего я не понимаю? Запуск xp_create_subdir ‘C:FTP_Root2020822 ‘ в MSSM работает нормально.
Запуск хранимой процедуры от имени SA или не-администратора TestUser дает этот результат:
Сообщение 229, уровень 14, состояние 5, Процедура xp_create_subdir, строка 1 [Строка запуска пакета 2] Разрешение на выполнение было отклонено для объекта xp_create_subdir, базы данных mssqlsystemresource, схемы sys.
Ответ №1:
Я нашел это на другом сайте:https://www.sqlservercentral.com/forums/topic/xp_create_subdir-for-non-sysadmins
Заголовки здесь состоят из двух основных моментов
-
Хотя это сообщение старое, чтобы решить эту проблему, вы должны убедиться, что вашей базе данных можно доверять, поскольку SP xp_create_subdir находится в другой базе данных
Вам все еще нужно установить «с Execute как ‘dbo’
изменить базу данных [DBNAME], установить значение trustworthy на
-
И поймите последствия для безопасности использования SET TRUSTWORTHY ON. Возможно, это не проблема или… это может. «Это зависит», но вы не узнаете, пока не прочитаете об этом.
Я полностью согласен с Джеффом в этом вопросе. Если вы удаленно заботитесь о безопасности, поймите, что делает параметр TRUSTWORTHY, прежде чем настраивать его.
Я думаю, что главный вопрос здесь заключается в том, чтобы спросить, зачем SQL Server нужно создавать каталог? Powershell может как запрашивать у базы данных путь к каталогу, так и создавать каталог. У вас может быть задание агента SQL Server, которое будет выполнять это в контексте безопасности либо учетной записи прокси-сервера SQL Server, либо учетной записи службы SQL Agent (я бы выбрал учетную запись прокси-сервера лично, но это касается только меня).
Комментарии:
1. Параметр Trustworthy решил проблему. Запуск SQL Express с использованием SQL Agent. это не вариант, я мог бы использовать скрипт Powershell и планировщик Windows, но для этого нужно было бы установить довольно высокую частоту, но использовать xp_create_subdir намного проще, поскольку я могу запустить его именно тогда, когда это необходимо.
2. Я рад, что у вас это работает. Дополнительное предупреждение из моего опыта работы с TRUSTWORTHY = ON. Если ваша среда может быть проверена на соответствие базовому уровню CIS, возможно, вам нужно будет подробнее рассказать об этом, почему это включено.