如何在存储过程中创建日志

时间:2014-12-11 05:42:02

标签: sql-server-2008 stored-procedures

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

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

但收到错误消息:

  

对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝。

请给我一些帮助。

3 个答案:

答案 0 :(得分:0)

使用数据库向对象授予权限

Use Master    
grant execute on xp_cmdshell to 'user'

答案 1 :(得分:0)

首先,您确定要将数据记录到文本文件中吗?将日志存储到单独的表中可能会更好吗?

如果您想使用文本文件:

  

xp_cmdshell生成的Windows进程具有与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

答案 2 :(得分:0)

使用xp_cmdshell进行日志记录对安全性和性能都不利。请从您的浏览器中删除 codeproject 链接,忘记您曾经看过它。说真的,这很糟糕。

如果要记录对proc的调用,请执行以下操作:

  • 为此设置一个表(如demas所建议)。您可以将DATETIME字段默认为GETDATE()或GETUTCDATE()。您可以为Proc Name指定一个字段,这是一个参数字段。不管。

  • 使用SQLCLR创建一个存储过程,该过程执行信息的简单File.Write。您可以使用模拟(xp_cmdshell无法做到的事情)使安全上下文成为运行proc的人的安全上下文,而不是SQL Server进程的登录帐户。即使不使用模拟,这种方法也比xp_cmdshell更有效且更有效。

  • 执行日志表+ SQL CLR [或其他]的组合:您可以登录到表以立即写入。然后设置一个SQL代理作业,使用SQLCLR或其他方法将X天以上的条目存档到文件中。通过这种方式,表格不会变得太大,而且信息可能比您目前正在研究的问题还要大。