我想将日志放在数据库中的一些存储过程中,以监视存储过程的工作。我是SQL Server 2008的新手。应该在生产服务器上创建日志。
我试过这个链接: http://www.codeproject.com/Articles/18469/Creating-Log-file-for-Stored-Procedure
但收到错误消息:
对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝。
请给我一些帮助。
答案 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将失败。
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天以上的条目存档到文件中。通过这种方式,表格不会变得太大,而且信息可能比您目前正在研究的问题还要大。