Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
на SQL2000 у меня работала процедура, которая создавала диф-бекапы.
Алгоритм был примерно такой:
- удаляем старые диф.бекапы в указанной папке
- создаем новый диф.бекап
- запускаем утилиту, которая делает архив диф.бекапа и раскидывает по хранилищам

в 1-м и 3-м шаге есть вызовы xp_cmdshell

В джобе по расписанию выполнялся вызов этой процедуры для всех баз.

При попытке создать подобное на SQL Server 2008, вывалилась ошибка:
автор
Executed as user: NT SERVICE\SQLSERVERAGENT. SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.


т.е. выполнение этой процедуры было отключено по соображениям безопасности, но можно включить.
И вот вопрос: если так всё страшно и опасно, можно ли это делать?
Или стоит воспользоваться другими способами делать диф.бекапы? Какими?

И почему была отключена эта процедура, если безопасность управляется ролями на сервере? А если все так страшно, то зачем дали возможность включить ее обратно?
15 мар 15, 17:44    [17386334]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
автор
Алгоритм был примерно такой
- удаляем старые диф.бекапы в указанной папке
- создаем новый диф.бекап
- запускаем утилиту, которая делает архив диф.бекапа и раскидывает по хранилищам
Уныние, а не алгоритм, ибо если фейл в момент создания последнего диф. бэкапа, то не будет никакого.

автор
И вот вопрос: если так всё страшно и опасно, можно ли это делать?
Можно. Никто вас не покусает за это.

автор
Какими?
Maintenance plan же.
15 мар 15, 19:25    [17386597]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
Гавриленко Сергей Алексеевич
Уныние, а не алгоритм, ибо если фейл в момент создания последнего диф. бэкапа, то не будет никакого.

в хранилищах лежат. Но если бы их не было, согласен - было бы уныло.
алгоритм основан именно на их наличии.
Гавриленко Сергей Алексеевич
Можно. Никто вас не покусает за это.

за то, чтобы из СКЛя переустановить пакет MSOffice на клиентском компе (ничего более извращенческого не придумал) тоже никто не покусает, но это неправильно.
Вопрос, правильно ли это - включить использование xp_cmdshell? И вообще все вопросы были заданы в первом сообщении.
Гавриленко Сергей Алексеевич
Maintenance plan же.

точно, в СКЛ2008 он гораздо более способный, чем в 2000-м. Не подумал про это. Спасибо :)
15 мар 15, 21:07    [17386835]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
ща... Ведь MaintenancePlans предлагает только делать бекапы или выполнить запрос. Если нужно вызвать какую-то утилиту (архивирование, к примеру) - опять придется вызывать xp_cmdshell.

как правильно-то?
15 мар 15, 21:12    [17386849]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Правильно - купить энтерпрайз и жать бэкапы средствами сервера. Все остальное делайте, чем вам угодно, хоть батником из планировщика винды.
15 мар 15, 21:13    [17386855]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
Гавриленко Сергей Алексеевич
Все остальное делайте, чем вам угодно, хоть батником из планировщика винды.

мне угодно сразу после окончания выполнения диф.бекапа запускать утилиту. Чем ее правильно запустить, если sp_cmdshell отключен?
планировщик винды никак не узнает, закончил СКЛ что-то выполнять или нет.
15 мар 15, 21:35    [17386896]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
нуб987
выполнение этой процедуры было отключено по соображениям безопасности, но можно включить.
И вот вопрос: если так всё страшно и опасно, можно ли это делать?
Можно. Естественно, включение уменьшает безопасность, но в общем несильно. Обычно самое плохое в этом случае - возможность получения доступа к ОС от лица админа сиквела, но права админа сиквела и так нужно защищать. Например, не выполнять все запросы от веб-сайта от учётки sa.
нуб987
ща... Ведь MaintenancePlans предлагает только делать бекапы или выполнить запрос. Если нужно вызвать какую-то утилиту (архивирование, к примеру) - опять придется вызывать xp_cmdshell.
В планах есть выполнение программы без всяких xp_cmdshell
нуб987
как правильно-то?
Вообще в джобах есть тип таска - выполнить программу. И опять же не нужно никаких xp_cmdshell.
Гавриленко Сергей Алексеевич
Правильно - купить энтерпрайз и жать бэкапы средствами сервера.
Хм, ради вызова архиватора платить сотни тысяч баксов? Я бы на месте платящего не сказал, что это правильно :-)
15 мар 15, 21:38    [17386900]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
нуб987
При попытке создать подобное на SQL Server 2008, вывалилась ошибка:
Точно 2008, не 2008 R2? В 2008 R2 есть встроенные средства сжатия бакапа начиная со стандартной версии, насколько я помню.
15 мар 15, 21:41    [17386909]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
нуб987
Гавриленко Сергей Алексеевич
Все остальное делайте, чем вам угодно, хоть батником из планировщика винды.

мне угодно сразу после окончания выполнения диф.бекапа запускать утилиту. Чем ее правильно запустить, если sp_cmdshell отключен?
планировщик винды никак не узнает, закончил СКЛ что-то выполнять или нет.
Наверное, имелось в виду, что и бакап нужно запускать из планировщика. А сразу после окончания - утилиту.

Но, повторю, это можно сделать и обычном джобе.
15 мар 15, 21:42    [17386914]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
alexeyvg
Вообще в джобах есть тип таска - выполнить программу. И опять же не нужно никаких xp_cmdshell.

но как организовать ветвление внутри джоба? Т.е. по условию стартовать один или другой шаг.

на 2000-м СКЛе у меня был (есть) джоб с такими шагами:
1. в базе tempdb создаем процедуру, описанную в первом посте (она удаляет старые дифы, создает новые и запускает утилиту). У нее есть 2 параметра: имя базы и путь, куда класть диф.
2. в последующих шагах мы вызываем эту процедуру для каждой базы
3. в последнем шаге удаляем процедуру.

таким образом, в случае каких-то изменений алгоритма, мы просто меняем код в первом шаге. Плюс мы можем перенести этот джоб на любой сервер (процедура создается в tempdb), которая есть на любом из них.

ПС. и чего вы привязались к сжатию бекапа? Да, в новых СКЛях есть такая возможность и проблем с этим нет. А какими средствами раскидывать эти бекапы по хранилищам (сетевые папки), удаляя старые?
Вот этим занимается вызываемая утилита.
15 мар 15, 21:57    [17386945]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
нуб987
но как организовать ветвление внутри джоба? Т.е. по условию стартовать один или другой шаг.
В настройках джоба можно указать, куда должен произойти переход, в зависимости от результатов его выполнения. Именно это называется "как организовать ветвление внутри джоба".

нуб987
на 2000-м СКЛе у меня был (есть) джоб с такими шагами:
1. в базе tempdb создаем процедуру, описанную в первом посте (она удаляет старые дифы, создает новые и запускает утилиту). У нее есть 2 параметра: имя базы и путь, куда класть диф.
2. в последующих шагах мы вызываем эту процедуру для каждой базы
3. в последнем шаге удаляем процедуру.
Ну разумеется, если не использовать xp_cmdshell, то так сделать не получится.
Нужно как то по другому. Например, в джобе делать не процедуру в tempdb, а, например, джобы с соответствующими шагами для каждой базы. Или cmd-файл с соответсвующими командами (удалить дифф, сделать дифф, запустить утилиту), и с параметрами имя сервера, имя базы, и т.д.

Естественно, на мой взгляд, писать всё это заново смысла не имеет, нужно просто включить xp_cmdshell, тем самым подняв уровень рисков всего лишь до того, который был у вас в 2000-м
15 мар 15, 22:34    [17387005]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
alexeyvg
нуб987
но как организовать ветвление внутри джоба? Т.е. по условию стартовать один или другой шаг.
В настройках джоба можно указать, куда должен произойти переход, в зависимости от результатов его выполнения. Именно это называется "как организовать ветвление внутри джоба".

млин, ну про это ветвление я в курсе :) Но мне не надо ошибки обрабатывать: если ошибка - выполняем один шаг, если успех - то другой. Или было предложение искусственно генерировать ошибку делением на 0, например? Ну это ж изврат.
Нужно ведь просто организовать ветвление в зависимости от условий:
if ... then ...
else if ... then ...
else ...

alexeyvg
Например, в джобе делать не процедуру в tempdb, а, например, джобы с соответствующими шагами для каждой базы. Или cmd-файл с соответсвующими командами (удалить дифф, сделать дифф, запустить утилиту), и с параметрами имя сервера, имя базы, и т.д.

т.е. писать свой скрипт для каждой базы? А потом если поменяется алгоритм, переписывать все эти скрипты на всех серверах?

alexeyvg
Естественно, на мой взгляд, писать всё это заново смысла не имеет, нужно просто включить xp_cmdshell, тем самым подняв уровень рисков всего лишь до того, который был у вас в 2000-м

и это главный вопрос всей этой темы :)
если функцию отключили, значит это кому-то нужно. ИМХО, это довольно радикальный шаг и просто так на него бы не пошли.
Да, оставили возможность включить ее обратно. Но сам факт отключения говорит о ее потенциальной небезопасности.
15 мар 15, 22:46    [17387023]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
нуб987
alexeyvg
Например, в джобе делать не процедуру в tempdb, а, например, джобы с соответствующими шагами для каждой базы. Или cmd-файл с соответсвующими командами (удалить дифф, сделать дифф, запустить утилиту), и с параметрами имя сервера, имя базы, и т.д.

т.е. писать свой скрипт для каждой базы? А потом если поменяется алгоритм, переписывать все эти скрипты на всех серверах?
Это всё зависит от того, как вы запрограммируете.
Можно сделать зараннее джоб, который будет в зависимости от переданных параметров (например, в табличке для передачи параметров) бакапить нужную базу.
Можно написать cmd-скрипт, который будет в зависимости от переданных параметров бакапить нужную базу.

То есть сделать то же самое, что было, только на другом языке.

А потом в джобе вызывать это с нужными параметрами, для каждой базы.
нуб987
если функцию отключили, значит это кому-то нужно. ИМХО, это довольно радикальный шаг и просто так на него бы не пошли.
Вы думаете, xp_cmdshell стал опаснее, чем был в 2000 версии, и его теперь отключили? Это не так.

Просто всё время повышаются требования к безопасности, и многое теперь считают опасным.
К тому же миллионы инсталляций бесплатных Express версий, с сайтами, работающими под sa с сиквелом, видимо, тоже подтолкнули к отключению по умолчанию xp_cmdshell, которая для подавляющего большинства не нужна.
А так, безопасность при её включении как была, так и осталась - она достаточна, если это нормальный инстанс, с админами, и с некими мерами безопасности.
Кстати, и многие фичи сиквела требуют её включения, не только желание напрямую использовать.
15 мар 15, 23:28    [17387079]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
alexeyvg, а можно чуть подробней, как из cmd запустить создание диф.бекапа?
15 мар 15, 23:31    [17387085]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
нуб987
alexeyvg, а можно чуть подробней, как из cmd запустить создание диф.бекапа?
SQLCMD.EXE /?
SQLCMD.EXE -q "backup database ..."
16 мар 15, 00:44    [17387239]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
alexeyvg
Хм, ради вызова архиватора платить сотни тысяч баксов? Я бы на месте платящего не сказал, что это правильно :-)
Не ради вызова архиватора, а ради экономии дисковых операций и времени.
16 мар 15, 01:07    [17387304]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Гавриленко Сергей Алексеевич
alexeyvg
Хм, ради вызова архиватора платить сотни тысяч баксов? Я бы на месте платящего не сказал, что это правильно :-)
Не ради вызова архиватора, а ради экономии дисковых операций и времени.
Я понимаю, что всё там в комплексе. Но не за такие же деньги :-)
Дешевле усилить дисковую подсистему, ведь речь тут о небольших базах, судя по описанию задачи, и только о процедуре бакапа.
16 мар 15, 01:57    [17387366]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
alexeyvg
Гавриленко Сергей Алексеевич
пропущено...
Не ради вызова архиватора, а ради экономии дисковых операций и времени.
Я понимаю, что всё там в комплексе. Но не за такие же деньги :-)
Дешевле усилить дисковую подсистему, ведь речь тут о небольших базах, судя по описанию задачи, и только о процедуре бакапа.
Вопрос был про "правильно", а не про "дешевле".
16 мар 15, 02:06    [17387374]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Гавриленко Сергей Алексеевич
Вопрос был про "правильно", а не про "дешевле"
Хм, я это не разделяю, оценка правильности решения без учёта его стоимости ИМХО бессмысленна :-)
16 мар 15, 10:57    [17388168]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
а зачем вообще ее отключили?
например, есть джобы, да. В них можно сделать шаг, который бы выполнял команду (например, запустил бы приложение с переданными ему параметрами).
По сути это же то же самое:
- то мы выполнили бы xp_cmdshell
- а то мы выполняем шаг джоба, который делает то же самое

почему одно запретили отключили, а другое нет?
18 мар 15, 02:01    [17397270]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
Glory
Member

Откуда:
Сообщений: 104751
нуб987
почему одно запретили отключили, а другое нет?

Потому что джоб еще надо создать, а xp_cmdshell сразу готова для запуска после установки сервера
18 мар 15, 09:30    [17397719]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
нуб987
а зачем вообще ее отключили?
например, есть джобы, да. В них можно сделать шаг, который бы выполнял команду (например, запустил бы приложение с переданными ему параметрами).
По сути это же то же самое:
- то мы выполнили бы xp_cmdshell
- а то мы выполняем шаг джоба, который делает то же самое

почему одно запретили отключили, а другое нет?


xp_cmdshell - утилита для админов и внутренних нужд сервера. Суть сервера баз данных - обслуживать запросы к базам данных, а не выступать в качестве сервера приложений. Вы пытаетесь реализовать Ваши задачи известным Вам путем, т.е. использованием "черного хода". На самом деле для технического обслуживания баз существуют другие прекрасные способы без использования хакерских трюков. И об этом выше было сказано.
18 мар 15, 10:53    [17398155]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
Владислав Колосов, вот для примера:
у меня есть задача расчитать управленческий учет. Т.е. дается текстовый файл с таблицей на какой магазин, продукт или менеджера сколько приходится расходов (реклама, доставка товара и т.п.).
В этом файле может быть от нескольких сотен записей до десятков тысяч.

Считается все это так:
- мы заливаем файл в таблицу с помощью bulk insert, перед этим проверяя наличие файла с помощью xp_cmdshell
- идет расчет (запросы СКЛ)
- после окончания выгружаем в текстовый файл табличку с непосчитанными записями (утилита bcp, запускаемая из xp_cmdshell)
- дальше запускаем архивирование этого файла (тоже xp_cmdshell)
- запускаем пакет DTS с процессингом куба:
declare
   @cmd varchar(4000)

set @cmd = 'dtsrun /S <ServerName> /N ' + @DTSName + ' /E'
exec master..xp_cmdshell @cmd --, no_output


Весь процесс разбит на несколько процедур. Есть "главная" процедура с задаваемыми параметрами (имя файла, тип расчета и еще несколько незначительных), которая последовательно выполняет вышеописанные пункты.
У меня есть заготовка с десятком вызовов этой процедуры с заранее записанными именами файлов (со временем наши девушки дополняют файлы и нужен перерасчет управл.учета) примерно такого вида:
exec SomeProc @FilaName = '\\share\File1.csv', @CalcType = 1 ...
exec SomeProc @FilaName = '\\share\File2.csv', @CalcType = 2 ...
exec SomeProc @FilaName = '\\share\File3.csv', @CalcType = 3 ...

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

Этот вариант отлично работал на СКЛ2000. В новых версиях такое работать не будет до включения запуска xp_cmdshell.
И в этой теме предлагается сделать все "правильно".
Как правильно это все можно сделать? В идеале, чтобы потом не пришлось вручную запускать из разных мест то севрерные планы, потом джобы, потом планировщики винды, потом вручную архивировать файлы....
18 мар 15, 15:25    [17400196]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
нуб987
Guest
подскажите плз, как правильно решить вышеописанную задачу с управленческим учетом?
19 мар 15, 03:34    [17403120]     Ответить | Цитировать Сообщить модератору
 Re: выполнение xp_cmdshell - как правильно?  [new]
Glory
Member

Откуда:
Сообщений: 104751
нуб987
подскажите плз, как правильно решить вышеописанную задачу с управленческим учетом?

Сделать один DTS/SSIS
19 мар 15, 09:16    [17403396]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить