问题描述
我被要求编写一个存储过程,用于处理 sql 表中的服务器列表。目的是浏览服务器列表并提取 sql 服务器版本和最近的维护计划历史记录,以便我可以使用 Web 应用程序将数据显示给管理人员。
我一切正常,我写了一个存储过程来在每晚午夜刷新数据。当以我的域用户身份运行时,我的 proc 在管理工作室中运行良好,但从 sql 作业运行时失败。正如您将在 proc 中看到的,它发生了很多事情!
我尝试进入作业步骤 > 高级选项卡并以我的域用户身份运行它,但作业仍然失败并出现权限错误。我在下面给出了我的 proc 代码的净化版本。
任何人对如何纠正此问题以便从 sql 作业运行的任何建议都将不胜感激。
谢谢,
斯图
-- exec [dbo].[sql_server_probe]
create proc [dbo].[sql_server_probe]
as
DECLARE @name VARCHAR(50) -- server name
declare @version varchar(1000)
declare @sql nvarchar(max)
declare @OPENQUERY varchar(1000)
truncate table existing_linked_servers
truncate table sql_server_details
truncate table sql_server_maint_plans
/*
select * from existing_linked_servers
select * from sql_server_details
select * from sql_server_maint_plans
*/
insert into existing_linked_servers
SELECT a.name
FROM sys.Servers a
LEFT OUTER JOIN sys.linked_logins b ON b.server_id = a.server_id
LEFT OUTER JOIN sys.server_principals c ON c.principal_id = b.local_principal_id
DECLARE db_cursor CURSOR FOR
select name from sql_servers where host in (
<list of host names>
) and State = 'Powered On'
and (name like '%-d-%'
or name like '%-t-%'
)
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
-- add a Linked Server if it's not already on the list...
if(@name not in (select distinct server from existing_linked_servers))
begin
set @sql = 'EXEC sp_addlinkedserver @server=''' + @name + ''''
exec(@sql)
end
-- attempt to connect the Linked Server and output the installed sql version
set @sql = 'SELECT @version = version FROM OPENQUERY([' + @name + '],''SELECT @@SERVERNAME as server,@@version as version'')'
EXEC SP_executesql @sql,N'@version varchar(1000) OUTPUT',@version = @version OUTPUT;
-- insert the sql version details...
insert into sql_server_details values (@name,@version)
set @sql = ' insert into [sql_server_maint_plans] (server,result,name,subplan_name,line1,line2,line3,line4,line5,start_time,end_time,command)
Select ''' + @name + ''' as server_name,case when D.Succeeded=1 then ''Success'' when D.succeeded=0 then ''Failed'' End as result,A.name,B.subplan_name,D.line1,D.line2,D.line3,D.line4,D.line5,D.start_time,D.end_time,D.command
From [' + @name + '].msdb.dbo.sysmaintplan_plans a
left join [' + @name + '].msdb.dbo.sysmaintplan_subplans b on a.id=b.plan_id
left join [' + @name + '].msdb.dbo.sysmaintplan_log c on c.plan_id=b.plan_id and c.Subplan_id=b.subplan_id
left join [' + @name + '].msdb.dbo.sysmaintplan_logdetail d on d.task_detail_id=c.task_detail_id
where D.start_time >= DateAdd("mm",-1,getDate())
Order By D.start_time DESC'
-- select @sql
EXEC SP_executesql @sql
-- remove the Linked Server
EXEC master.sys.sp_dropserver @name,'droplogins'
END TRY
BEGIN CATCH
-- cant connect to Linked Server
insert into sql_server_details values (@name,'Error occurred ' + ERROR_MESSAGE())
select ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)