Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
В общем есть скрипт, который проверяет сколько свободного места на диске и если его меньше 1000 mb шлет сообщение.

-- проверяем есть ли такая таблица, если да удаляем
IF OBJECT_ID('tempdb..#AbouDisk') IS NOT NULL   
 DROP TABLE #AbouDisk;
-- создаеам временную таблицу
CREATE TABLE #AbouDisk   
    (
      DiskInfo VARCHAR(2) ,
      FreeSpace int
    );
-- получаем данные о дисках и свободном месте на них (в Mb) со вставкой во вр. таб.    
insert into #AbouDisk
 exec master..xp_fixeddrives;  
-- обьявляем курсор
declare some_cursor cursor for 
-- sql запрос формирующий набор данных для курсора
select *                       
 from #AbouDisk;
-- открываем курсор
open some_cursor  
-- получаем кол-во дисков на сервере и объявляем переменные
DECLARE @koldisk int;
SET @koldisk = (select COUNT(*) from #AbouDisk);
declare  @counter int
declare  @string_var varchar(2), @int_var int 
set @counter = 0
-- выборка первой  строки
fetch next from some_cursor INTO  @string_var, @int_var
-- цикл с логикой и выборкой всех последующих строк после первой
while @@FETCH_STATUS = 0
 begin
 select @string_var, @int_var
 -- если место на диске < числа отправляем письмо
 if @int_var<1000
   begin
     EXEC msdb.dbo.sp_send_dbmail   
        @profile_name = 'DB_Mail',   -- профиль администратора почтовых рассылок
        @recipients = 'user1@mail.ru;user2@mail.ru',   -- адрес получателя
        @body = N'Место на одном из дисков меньше 1000 Mb
		',   -- текст письма
        @subject = N'Недостаточно места на диске',   -- тема
        @query='exec master..xp_fixeddrives'   -- результат SQL-запроса
   end    
 fetch next from some_cursor INTO  @string_var, @int_var
 -- Увеличиваем счетчик на 1 и проверяем условия прерывания цикла
 set @counter = @counter + 1
 if @counter >= @koldisk break
end
-- закрываем курсор
close some_cursor
deallocate some_cursor
-- удаляем временную таблицу
drop table #AbouDisk;


В чем собственно вопрос, насколько я знаю использовать курсоры не есть хорошо, такие запросы долго выполняются, вот я и хотел спросить может кто нибудь знает менее ресурсоемкую альтернативу такой задаче?
Спрашиваю т.к. сейчас надо будет реализовать что то похожее (получаем список, построчно проходим его, применяя к каждой строке определенное условие), но там будет в районе 100 записей, в будущем может и больше.

Сообщение было отредактировано: 29 июн 15, 14:29
29 июн 15, 11:42    [17827461]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Glory
Member

Откуда:
Сообщений: 104760
dark_DBa_dmin
насколько я знаю использовать курсоры не есть хорошо, такие запросы долго выполняются,

запрос к таблице с сотней записей ?
29 июн 15, 11:44    [17827474]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
Я хочу реализовать таким же образом уведомление если БД не бекапилась > N дней. На некоторых серваках бывает очень много БД, доходит до сотни.
Glory
dark_DBa_dmin
насколько я знаю использовать курсоры не есть хорошо, такие запросы долго выполняются,

запрос к таблице с сотней записей ?
29 июн 15, 11:49    [17827488]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Glory
Member

Откуда:
Сообщений: 104760
dark_DBa_dmin
Я хочу реализовать таким же образом уведомление если БД не бекапилась > N дней. На некоторых серваках бывает очень много БД, доходит до сотни.

т.е. вас категорически не устраивает производительность запроса select * from table_with_100_records ?
29 июн 15, 11:51    [17827502]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
По сути мой вопрос указан в теме: Есть ли альтернатива курсору? Так как я не вижу другого способа пройти построчно результат select со сто строками, чтобы он проверял, 1я строка, бэкап свежий, идем дальше, 2я строка, бекап < 5 дней, не дело, пишем админу письмо и т.д. Так часто бывает необходимо сделать что то подобное и кроме курсора как это сделать я не знаю.
Glory
dark_DBa_dmin
Я хочу реализовать таким же образом уведомление если БД не бекапилась > N дней. На некоторых серваках бывает очень много БД, доходит до сотни.

т.е. вас категорически не устраивает производительность запроса select * from table_with_100_records ?
29 июн 15, 11:58    [17827535]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Glory
Member

Откуда:
Сообщений: 104760
dark_DBa_dmin
По сути мой вопрос указан в теме: Есть ли альтернатива курсору?

Если вы хотите для каждой записи вызывать процедуру, то разумеется альтернативы нет
А вот почему вы решили для каждой записи вызывать процедуру, так кто же это знает
29 июн 15, 12:01    [17827553]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
Так как не вижу другого варианта, для этого я и создал тему, чтобы люди поопытние посоветовали альтернативу, если она есть.
Glory
dark_DBa_dmin
По сути мой вопрос указан в теме: Есть ли альтернатива курсору?

Если вы хотите для каждой записи вызывать процедуру, то разумеется альтернативы нет
А вот почему вы решили для каждой записи вызывать процедуру, так кто же это знает
29 июн 15, 12:06    [17827575]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Glory
Member

Откуда:
Сообщений: 104760
dark_DBa_dmin
Так как не вижу другого варианта, для этого я и создал тему, чтобы люди поопытние посоветовали альтернативу, если она есть.

Что мешает отправать одно письмо с результатом запроса, который вернет всю нужную информацию о всех базах/дисках ?
29 июн 15, 12:08    [17827586]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
И правда что мешает... Спасибо!
Glory
dark_DBa_dmin
Так как не вижу другого варианта, для этого я и создал тему, чтобы люди поопытние посоветовали альтернативу, если она есть.

Что мешает отправать одно письмо с результатом запроса, который вернет всю нужную информацию о всех базах/дисках ?
29 июн 15, 12:12    [17827605]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
dark_DBa_dmin
свободного места на диске и если его меньше... шлет сообщение. альтернативу такой задаче?


USE [msdb]
GO

EXEC msdb.dbo.sp_add_alert @name=N'low disk space E:', 
		@message_id=0, 
		@severity=0, 
		@enabled=1, 
		@delay_between_responses=0, 
		@include_event_description_in=1, 
		@category_name=N'[Uncategorized]', 
		@wmi_namespace=N'\\.\ROOT\CIMV2', 
                -- Если меньше 40 Gb
		@wmi_query=N'SELECT * FROM __InstanceModificationEvent WITHIN 1800 WHERE TargetInstance ISA "Win32_LogicalDisk" AND TargetInstance.FreeSpace < 42949672960 AND
TargetInstance.DeviceID = ''E:'' ', 
		@job_id=N'00000000-0000-0000-0000-000000000000'
GO
EXEC msdb.dbo.sp_update_notification 
	@alert_name=N'low disk space E:', 
	@operator_name=N'Сюда вписать оператора, которому будет отправлено письмо', 
	@notification_method = 1
GO
29 июн 15, 12:27    [17827673]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
Я тоже сначала хотел через WMI, но насколько я знаю для этого надо быть или локальным админом или админом домена, а у меня не на все серваки есть доступ, поэтому пытался создать что то более универсальное. Но тем не менее большое спасибо!
churupaha
dark_DBa_dmin
свободного места на диске и если его меньше... шлет сообщение. альтернативу такой задаче?


USE [msdb]
GO

EXEC msdb.dbo.sp_add_alert @name=N'low disk space E:', 
		@message_id=0, 
		@severity=0, 
		@enabled=1, 
		@delay_between_responses=0, 
		@include_event_description_in=1, 
		@category_name=N'[Uncategorized]', 
		@wmi_namespace=N'\\.\ROOT\CIMV2', 
                -- Если меньше 40 Gb
		@wmi_query=N'SELECT * FROM __InstanceModificationEvent WITHIN 1800 WHERE TargetInstance ISA "Win32_LogicalDisk" AND TargetInstance.FreeSpace < 42949672960 AND
TargetInstance.DeviceID = ''E:'' ', 
		@job_id=N'00000000-0000-0000-0000-000000000000'
GO
EXEC msdb.dbo.sp_update_notification 
	@alert_name=N'low disk space E:', 
	@operator_name=N'Сюда вписать оператора, которому будет отправлено письмо', 
	@notification_method = 1
GO
29 июн 15, 12:33    [17827706]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Glory
Member

Откуда:
Сообщений: 104760
dark_DBa_dmin
но насколько я знаю для этого надо быть или локальным админом или админом домена, а у меня не на все серваки есть доступ,

Алерты выполняет сервер, а не вы.
У вас должны быть права на создание алерта.
29 июн 15, 12:34    [17827716]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
Ясно. Но здесь нужно указывать конкретный диск, что не очень удобно.
Glory
dark_DBa_dmin
но насколько я знаю для этого надо быть или локальным админом или админом домена, а у меня не на все серваки есть доступ,

Алерты выполняет сервер, а не вы.
У вас должны быть права на создание алерта.
29 июн 15, 12:40    [17827755]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Glory
Member

Откуда:
Сообщений: 104760
dark_DBa_dmin
Но здесь нужно указывать конкретный диск, что не очень удобно.

т.е создать алерт на каждый диск - это уже космос ?
29 июн 15, 12:42    [17827772]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
) Нет конечно, это было просто замечание.
Glory
dark_DBa_dmin
Но здесь нужно указывать конкретный диск, что не очень удобно.

т.е создать алерт на каждый диск - это уже космос ?
29 июн 15, 12:45    [17827789]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Если вы хотите для каждой записи вызывать процедуру, то разумеется альтернативы нет

Вообще-то есть. Никто не мешает сделать цикл и в цикле "ходить" по строкам. Просто датасет для обработки надо заранее пронумеровать построчно. А вот насколько оно хуже/лучше курсора в плане производительности, я не знаю. Но всегда можно поэксперементировать.
29 июн 15, 13:21    [17827966]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
Спасибо, надо будет попробывать!
Cammomile
Если вы хотите для каждой записи вызывать процедуру, то разумеется альтернативы нет

Вообще-то есть. Никто не мешает сделать цикл и в цикле "ходить" по строкам. Просто датасет для обработки надо заранее пронумеровать построчно. А вот насколько оно хуже/лучше курсора в плане производительности, я не знаю. Но всегда можно поэксперементировать.
29 июн 15, 13:45    [17828157]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Скорее всего смысла не будет.
29 июн 15, 13:56    [17828221]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Есть предположение, что накрутить динамику будет быстрее чем курсор.
29 июн 15, 13:58    [17828226]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Какое отношение имеет контроль места на диске к сиквелу? Правильно, никакого. Для этого существуют инструменты администратора Windows.
29 июн 15, 15:24    [17828699]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
dark_DBa_dmin
Member

Откуда:
Сообщений: 105
А если доступа к этим инструментам нету, а быть в курсе надо, чтобы во время пнуть админа хотя бы. Знания о наличие свободного места никогда не помешают. Да и вообше чем большим кол-ом способов ты можешь решить проблему, тем лучше.
Владислав Колосов
Какое отношение имеет контроль места на диске к сиквелу? Правильно, никакого. Для этого существуют инструменты администратора Windows.
30 июн 15, 10:57    [17831510]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Glory
Member

Откуда:
Сообщений: 104760
dark_DBa_dmin
А если доступа к этим инструментам нету,

А еще из SQL можно сделать сервер печати. И много еще чего
30 июн 15, 10:58    [17831519]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Если доступа нету, то это не Ваши проблемы.
30 июн 15, 11:48    [17831915]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли альтернатива курсору? Или как получить информацию о месте на диске с уведомлением.  [new]
o-o
Guest
dark_DBa_dmin
А если доступа к этим инструментам нету, а быть в курсе надо, чтобы во время пнуть админа хотя бы

тогда надо начинать с оглашения своих прав.
на сервер и на тот комп вообще.
фига ли узнать что-то о системе, не имея на нее прав
30 июн 15, 12:22    [17832164]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить