2014-12-11 84 views
0

我想将日志存储在我们数据库中的某些存储过程中,以监视存储过程的工作情况。我是SQL Server 2008的新手。日志应该在生产服务器上创建。如何在存储过程中创建日志

我试过此链接: http://www.codeproject.com/Articles/18469/Creating-Log-file-for-Stored-Procedure

,但得到的错误信息:

执行权限被拒绝的对象 '的xp_cmdshell',数据库 'mssqlsystemresource',架构 'SYS'。

请给我一些必要的。

回答

0

首先,你确定你想将数据记录到文本文件授予权限?可能将日志存储到单独的表格会更好吗?

如果你想与文本文件的工作:

Windows进程使用xp_cmdshell催生具有相同的安全权限的SQL Server服务帐户。

检查此帐户的安全权限。

可以使用基于策略的管理或通过执行sp_configure来启用和禁用xp_cmdshell。

检查确保已启用。

EXEC sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
EXEC sp_configure 'xp_cmdshell', 1 
GO 
RECONFIGURE 
GO 

当由不是sysadmin固定服务器角色成员的用户调用xp_cmdshell的使用存储在一个名为## xp_cmdshell_proxy_account ##凭据的帐户名和密码连接到Windows。如果此代理凭证不存在,则xp_cmdshell将失败。

您需要create proxy account

EXEC sp_xp_cmdshell_proxy_account [MyDomain\SQLServerProxy], 'usdcu&34&23' 

添加权限使用该SP:

USE master; 
GRANT EXECUTE on xp_cmdshell to Current_user 

这里是一个更detailed information

+0

hi @demas,我没有权限执行此操作,它有任何方法可以跟踪storeprocedure的工作而不使用xp_cmdshell – 2014-12-11 09:27:22

+0

您可以更改sp的代码并将所需的所有信息存储在表中,您将为此任务创建 – demas 2014-12-11 09:55:02

0

使用数据库对象应该做

Use Master  
grant execute on xp_cmdshell to 'user' 
+0

http://stackoverflow.com/questions/2016669/getting-execute-permission-to-xp-cmdshell您也可以参考此链接。这已经被回答了。 – msgpdev10 2014-12-11 05:56:07

0

使用xp_cmdshell进行日志记录对安全性和性能都不利。请从您的浏览器中删除codeproject链接,并忘记您曾经看到过它。严重的是,这是坏事。

如果你想登录到特效的呼叫,包括:

  • 摆一张桌子,这(如德马斯还建议)。您可以将DATETIME字段默认为GETDATE()或GETUTCDATE()。您可以为Proc Name(参数字段)提供一个字段。随你。

  • 使用SQLCLR来创建一个存储过程,做了信息的简单File.Write。您可以使用模拟(xp_cmdshell不能这样做)使安全上下文成为运行proc的人员的安全上下文,而不是SQL Server进程的登录帐户。即使未使用模拟,此方法的效率也高于xp_cmdshell

  • 执行日志表+ SQL CLR [或别的]的组合:您可以登录到表上写。然后设置一个SQL Agent作业,使用SQLCLR或其他方法将超过X天的条目归档到文件中。通过这种方式,表格不会变得太大,因为信息可能比您目前正在研究的问题所需的信息要旧得多。

+0

i我也觉得使用xp_cmdshell不是一个好主意,因为我还需要一个管理员权限。因此,你能告诉我如何通过sqlclr创建一个storedprocedure。 – 2014-12-11 09:20:47