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

1) Имеется таблица:

CREATE TABLE [dbo].[server_disk_freespace_monitor](
[servername] [nvarchar](20) NULL,
[diskname] [nvarchar](1) NULL,
[freespace_size] [decimal](15, 2) NULL,
[monitordate] [datetime] NULL,
) ON [PRIMARY]

2) Далее объявляем переменную

DECLARE @S_Name NVARCHAR(20)
SET @S_Name = @@SERVERNAME

3) Если выполнить команду

INSERT INTO dbo.server_disk_freespace_monitor(Diskname, freespace_size)
EXEC master.sys.xp_fixeddrives

в таблицу dbo.server_disk_freespace_monitor будут добавлены строки:

servername diskname freespace_size monitordate
NULL C 58550.00 NULL
NULL D 10200.00 NULL

каким образом сделать так, чтобы в поле servername, вместо NULL записывалось значение переменной @S_Name,
а в поле monitordate - текущая дата?
13 июн 13, 13:33    [14427962]     Ответить | Цитировать Сообщить модератору
 Re: Как результат xp_fixeddrives записать в таблицу БК?  [new]
Glory
Member

Откуда:
Сообщений: 104760
NoviceSQL
каким образом сделать так, чтобы в поле servername, вместо NULL записывалось значение переменной @S_Name,
а в поле monitordate - текущая дата?

Сделать default constarint-ы для этих полей таблицы
13 июн 13, 13:35    [14427977]     Ответить | Цитировать Сообщить модератору
 Re: Как результат xp_fixeddrives записать в таблицу БК?  [new]
NoviceSQL
Guest
Glory
NoviceSQL
каким образом сделать так, чтобы в поле servername, вместо NULL записывалось значение переменной @S_Name,
а в поле monitordate - текущая дата?

Сделать default constarint-ы для этих полей таблицы


Спасибо. Да, в случае с полем monitordate, создавать таблицу нужно было так:

CREATE TABLE [dbo].[server_disk_freespace_monitor](
[servername] [nvarchar](20) NULL,
[diskname] [nvarchar](1) NULL,
[freespace_size] [decimal](15, 2) NULL,
[monitordate] [datetime] DEFAULT GETDATE()
) ON [PRIMARY]

Но вообще, стоит задача несколько глобальнее. Есть десятки серверов SQL Server. Пытаюсь написать скрипт, который затем
запихнуть в задание SQL Agent, чтобы автоматизировать мониторинг свободного пространства на дисках этих серверов, при котором таблица мониторинга
заполнялась бы как-то так:

servername diskname freespace_size monitordate
SERVER1 C 58550.00 13.05.2013
SERVER1 D 10200.00 13.05.2013
SERVER2 C 30000.00 13.05.2013
SERVER2 D 10000.00 13.05.2013
SERVER2 E 60000.00 13.05.2013
SERVER3 С 15000.00 13.05.2013
...
SERVER1 C 58500.00 14.05.2013
SERVER1 D 10000.00 14.05.2013

Кто-нибудь решал подобную задачу? Спасибо.
14 июн 13, 07:49    [14431610]     Ответить | Цитировать Сообщить модератору
 Re: Как результат xp_fixeddrives записать в таблицу БК?  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
NoviceSQL
каким образом сделать так, чтобы в поле servername, вместо NULL записывалось значение переменной @S_Name,
а в поле monitordate - текущая дата?


или, (как вариант, если еще что-то записывать нужно), пихать вначале во временную таблицу, потом уже из временной в свою, с подстановкой нужного
14 июн 13, 09:21    [14431962]     Ответить | Цитировать Сообщить модератору
 Re: Как результат xp_fixeddrives записать в таблицу БК?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
NoviceSQL,
Можно попробовать таким образом:
DECLARE @sql varchar(max),@srvname varchar(150)
 
INSERT INTO dbo.server_disk_freespace_monitor(Diskname, freespace_size)
EXEC master.sys.xp_fixeddrives --для сервера, на котором запущено Задание

UPDATE server_disk_freespace_monitor SET servername=@@SERVERNAME WHERE servername IS NULL

DECLARE curs CURSOR FOR 
SELECT datasource FROM sys.sysservers WHERE srvnetname<>@@SERVERNAME 
	AND dataaccess=1
	AND rpc=1
	and srvproduct='SQL Server'

OPEN CURS
FETCH NEXT FROM curs INTO @srvname
WHILE @@fetch_status=0 BEGIN
SET @sql=N'
	INSERT server_disk_freespace_monitor(Diskname, freespace_size)
	EXEC ['+RTRIM(LTRIM(@srvname))+'].master.sys.xp_fixeddrives'
	exec(@sql)
	
	SET @sql=N'UPDATE server_disk_freespace_monitor SET servername='''+RTRIM(LTRIM(@srvname))+''' WHERE servername IS NULL'
	exec (@sql)
FETCH NEXT FROM curs INTO @srvname
END
CLOSE curs
DEALLOCATE curs
14 июн 13, 09:29    [14432003]     Ответить | Цитировать Сообщить модератору
 Re: Как результат xp_fixeddrives записать в таблицу БК?  [new]
NoviceSQL
Guest
Сергей Викт.,

Именно то, что нужно было. Спасибо!
14 июн 13, 10:33    [14432303]     Ответить | Цитировать Сообщить модератору
 Re: Как результат xp_fixeddrives записать в таблицу БК?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
NoviceSQL
Сергей Викт.,

Именно то, что нужно было. Спасибо!

Тогда вот предлагаю сделать так:
Создаёте джоб.
В первом шаге указываете:
REATE TABLE [dbo].[server_disk_freespace_monitor](
 [servername] [nvarchar](20) , 
[diskname] [nvarchar](1) NULL,
 [freespace_size] [decimal](15, 2) NULL,
 [monitordate] [datetime] DEFAULT GETDATE()
 ) ON [PRIMARY]
 
DECLARE @sql varchar(max),@srvname varchar(150)
 
INSERT INTO dbo.server_disk_freespace_monitor(Diskname, freespace_size)
EXEC master.sys.xp_fixeddrives --для сервера, на котором запущено Задание

UPDATE server_disk_freespace_monitor SET servername=@@SERVERNAME WHERE servername IS NULL

DECLARE curs CURSOR FOR 
SELECT datasource FROM sys.sysservers WHERE datasource<>@@SERVERNAME 
	AND dataaccess=1
	AND rpc=1
	and srvproduct='SQL Server'

OPEN CURS
FETCH NEXT FROM curs INTO @srvname
WHILE @@fetch_status=0 BEGIN
SET @sql=N'
	INSERT server_disk_freespace_monitor(Diskname, freespace_size)
	EXEC ['+RTRIM(LTRIM(@srvname))+'].master.sys.xp_fixeddrives'
	exec(@sql)
	
	SET @sql=N'UPDATE server_disk_freespace_monitor SET servername='''+RTRIM(LTRIM(@srvname))+''' WHERE servername IS NULL'
	exec (@sql)
FETCH NEXT FROM curs INTO @srvname
END
CLOSE curs
DEALLOCATE curs


Во втором:
DECLARE @tableHTML  NVARCHAR(MAX) ;

SET @tableHTML =
    N'<H1>Free Disk Space Report</H1>' +
    N'<table border="1">' +
    N'<tr><th>Server Name</th><th>Disk Name</th>' +
    N'<th>Free Space, MB</th><th>Date of monitoring</th>' +
		CAST ( (SELECT 
		td = servername,       '',
		td = diskname,         '',
		td = freespace_size,   '',
		td = monitordate,      ''
		FROM [server_disk_freespace_monitor]
		ORDER BY 1,2
		FOR XML PATH('tr'),TYPE
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;


EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'sql_db_mail',
    @recipients = 'test@test.ru' ,
    @copy_recipients = '',
    @subject = 'Свободное место на серверах',
    @body=@tableHTML,
    @body_format = 'HTML';

DROP TABLE [server_disk_freespace_monitor]


И будет оно вам слать уведомления раз в сутки (или как настроите) в виде красивой таблички:)

P.S. У себя так сейчас сделал, раньше самописная процедура была.
14 июн 13, 10:44    [14432376]     Ответить | Цитировать Сообщить модератору
 Re: Как результат xp_fixeddrives записать в таблицу БК?  [new]
Glory
Member

Откуда:
Сообщений: 104760
NoviceSQL
чтобы автоматизировать мониторинг свободного пространства на дисках этих серверов

Для этого уже есть Alert-ы
Или вы хотите собирать историю изменения места на диске ???
14 июн 13, 10:46    [14432396]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить