пятница, июля 18, 2008

SQL Web Assistant procedures exceptions

SQL Server blocked access to procedure 'sys.xp_makewebtask'

Досталась в наследство следующая логика: в базе данных на определенной таблице (назовем ее не задумываясь test_table) в триггере на добавление записи пере/создавался файл в определенном каталоге, за которым собственно следил механизм типа file watcher в рамках web site - ну вот такая логика ни что не поделаешь - т.е. суть как я понимаю (до сих пор я много чего не могу понять в определенных моментах проекта) при добавлении записи в таблицу test_table дернуть сайт на выполнение определенной операции, т.е. эдакий механизм messaging & notification между sql server и web application, причем однонаправленный :)...

создание файла со стороны sql server происходило не иначе как через

master.dbo.sp_makewebtask

ну вот такой способ, суть не в этом, а в том , что при очередном переезде на новые сервера данный механизм стал глючить, а именно, при добавлении записи в таблицу test_table стал происходить exception следующего вида:


SQL Server blocked access to procedure 'sys.xp_makewebtask' of component 'Web Assistant Procedures'
because this component is turned off as part of the security configuration for this server.
A system administrator can enable the use of 'Web Assistant Procedures' by using sp_configure.
For more information about enabling 'Web Assistant Procedures',
see "Surface Area Configuration" in SQL Server Books Online.
The statement has been terminated.




Решение состоит в том, чтобы просто разрешить выполнения процедур Web Assistant Procedures:


sp_configure 'Web Assistant Procedures'
sp_configure 'Web Assistant Procedures', 1
reconfigure with override



однако, дальше случается следующее: при попытке записи в текстовый файл:


execute master.dbo.sp_makewebtask @outputfile = 'D:\Cache\cache.txt', @query = N'SELECT top 1 * FROM dbname.dbo.test_table'



получаю сообщение о невозможности произвести такую операцию, так как не хватает прав;

Решением ситуации становится разрешение для данного конкретного файла cache.txt на запись для пользователя everyone;


но и это не все :), ситуация развивается дальше:


SQL Web Assistant: Could not open the output file.


на продакшн системе ситуация следующая: sql server instance находится на одном сервере, web server application на другом,
при этом нужно настроить db server таким образом что при добавлении/изменении/удалении записей в нашу test_table срабатывал триггер,
который дергает процедуру master.dbo.sp_makewebtask, которая в свою очередь просто создает файл cache.txt в указанном каталоге (воооот)...
Но!!! сам файл должен находится на сервере web application в указанном через конфиг каталоге (помним, за ним смотрим file watcher)...
Каталог был расшарен, разрешен доступ для everyOne | quests, даны полные права на доступ, master.dbo.sp_makewebtask вызывал
с указанием пути к файлу через UNC имя, но сообщение

SQL Web Assistant: Could not open the output file.

о невозможности записи в файл так и возникало....
(Установка прав на запись для пользователя evereone ни к чему не привела, сообщение об ошибке так и возникало)

порывшись в инете, нашел решение:


How to use UNC name with sp_makewebtask in sql server

(
вырезка:


10 Apr 2008, 1:58 PM UTC
Jonathan Kehayias
These stars recognize your participation in the forums. For more information about the different levels of stars, and how points are earned, please see the FAQ.
Answerer


Posts 2,350

Answer Re: How to use UNC name with sp_makewebtask in sql server
Answer Was this post helpful ? Reply Quote


The Service Logon Account for SQL Server will need to have access to
the that shared path to read or write from there.
If SQL Server is running as Local System, you should change this to a
dedicated login account to a set user, and then grant that user
access to the shared path you want:


http://support.microsoft.com/kb/283811


Also, you can't use mapped drives like you would probably expect.
The drive is mapped at login, and is not actually a persistent drive available to the services.


)



How to change the SQL Server or SQL Server Agent service account without using SQL Enterprise Manager in SQL Server 2000 or SQL Server Configuration Manager in SQL Server 2005


http://support.microsoft.com/kb/283811



Вообщем, как итог, решение состоит в том, чтобы запустить инстанс sql server от имени учетной записи, но не local system, а той, которой разрешены
права на запись в указанный расшаренный каталог, в моем случае я просто запустил Sql server от имени administrator сервера (если подумать, то это конечно дыра в безопасности, но как временное решение до переделки самого механизма вполне достаточно):

Следующий тест должен пройти успешно:


declare @file_location varchar(100)
set @file_location = '\\unc name of web application server\TemporaryFiles\cache.txt'

execute master.dbo.sp_makewebtask @outputfile = @file_location, @query = 'SELECT top 1 * FROM dbo.test_table'





Самое интересное то, что сделав через network mapping отдельный диск, замапленный на расшаренную папку, и указав для master.dbo.sp_makewebtask путь через
такой замапленный диск, получаем предыдущее сообщение об ошибке.



Msg 16821, Level 11, State 1, Procedure sp_makewebtask, Line 131
SQL Web Assistant: Could not open the output file.




т.е. в любом случае нужно использовать unc name;

ps: sorry за сумбурную форму написания, надеюсь, данный пост будет комунить интересен и поможет в решении похожей проблемы


Комментариев нет: