所以我正在尝试学习SQLCLR,并选择编写一个基本上收集一些perfmon计数器的表值函数。我能够成功运行它并从托管数据库实例的服务器收集计数器。但是,当我尝试访问另一台服务器上的计数器时,我得到“访问被拒绝”。如果我将运行SQL Server的帐户添加到远程服务器上的“性能监视器用户”组,我能够使它工作,但我想知道我是否可以将该功能作为不同的Windows帐户运行?也就是说,我是否可以专门为此任务创建一个Windows帐户,并以某种方式使SQL Server在该上下文中运行该功能?
答案 0 :(得分:1)
不,您不能将SQLCLR功能作为特定用户运行。您可能会听到使用LogonUser
API在SQLCLR函数中模拟用户,但该方法存在问题欺诈,尤其是因为存在密码存储问题。正确的解决方案正是您所做的,通过将SQL Server帐户添加到所需的安全组来授予SQL Server帐户所需的权限。顺便说一句,如果您的SQLCLR函数模拟当前的Windows登录,您需要设置constrained delegation。
话虽这么说,使用SQLCLR连接到远程机器上任何并不是一件好事。窃取宝贵的SQL Server workers让他们等待慢速网络访问将导致服务器在负载下停止运行。您可以这样做,以学习如何做到这一点,但甚至不考虑在生产中部署它。计数器收集由外部进程完成,并将计数器保存在数据库中。事实上,已经有一个完全的工具:logman.exe
。
最后:从C#API查询性能计数器是极其低效的。您将很快发现有一个更快的API,PDH library。但是PDH没有管理等价物,所以你会回到原点,即使用 开箱即用的工具<{1}}。{/ p>