如何使用 SP_executesql - 以特定用户身份运行

问题描述

我被要求编写一个存储过程,用于处理 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...