EntLib和SQLCLR?

时间:2011-02-24 16:40:34

标签: sql-server enterprise-library sqlclr

我的MSSQL 2008 DB中有很多SQLCLR函数和sprocs。调试和记录始终是一个问题。我已经在直接的C#应用​​程序中使用了Microsoft Enterprise Library Logging Application Block,并且想知道它是否(1)疯狂或(2)无法将其分层到SQLCLR中。我真的很喜欢使用配置文件为不同的事件定义滚动文本日志,事件日志和SMTP输出,所以如果还有其他方法可以这样做,我会全力以赴......

感谢。

1 个答案:

答案 0 :(得分:1)

似乎有可能。我不知道这是否可取。

一种替代方法是在代码中定义跟踪侦听器,当然可以从数据库中读取配置。另一种方法是将消息记录到SQL表并使用触发器来启用通知。

我还必须质疑,真正的错误是你的数据库中是否有CLR存储过程,它们有如此多的业务逻辑需要记录。我是数据库中业务逻辑的忠实粉丝,但我对CLR存储过程保持警惕。

如果要使用企业应用程序块,则要编辑的配置文件将是C:\ Program Files \ Microsoft SQL Server \ MSSQL10.INSTANCE_NAME \ MSSQL \ Binn \ sqlservr.config。但是,重新启动时,sql server似乎不会将值写入此文件。我使用以下CLF PROC和UDF得出了这个结论:

using System;
using System.Configuration;
using Microsoft.SqlServer.Server;

namespace LoggedClr
{

    public static class AppDomainInfo
    {

        [SqlFunction]
        public static string GetConfigFileName()
        {
            return AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
        }

        [SqlFunction]
        public static string GetAppConfigValue(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }

        [SqlProcedure]
        public static void SetAppConfigValue(string key, string value)
        {
            ConfigurationManager.AppSettings[key] = value;

        }
    }
}

我使用以下T-SQL加载并运行了它:

CREATE DATABASE TestAssembly
GO

USE TestAssembly
GO

ALTER DATABASE TestAssembly SET TRUSTWORTHY ON;
GO

ALTER AUTHORIZATION ON DATABASE::TestAssembly TO test
GO

DROP ASSEMBLY LoggedClr 
GO

CREATE ASSEMBLY LoggedClr 
    from 'C:\justin''s projects\TestClr\LoggedClr\LoggedClr\bin\Debug\LoggedClr.dll' 
    WITH PERMISSION_SET = EXTERNAL_ACCESS
GO

CREATE FUNCTION GetConfigFileName () RETURNS NVARCHAR(MAX) AS 
    EXTERNAL NAME LoggedClr.[LoggedClr.AppDomainInfo].GetConfigFileName
GO

CREATE FUNCTION GetAppConfigValue (@key nvarchar(max)) RETURNS nvarchar(max) AS 
    EXTERNAL NAME LoggedClr.[LoggedClr.AppDomainInfo].GetAppConfigValue
GO

CREATE PROCEDURE SetAppConfigValue (@key nvarchar(max), @value nvarchar(max)) AS 
    EXTERNAL NAME LoggedClr.[LoggedClr.AppDomainInfo].SetAppConfigValue
GO

SELECT dbo.GetConfigFileName()
EXEC dbo.SetAppConfigValue 'justin', 'is a developer'
SELECT dbo.GetAppConfigValue('justin')

这给了我以下结果:

------------------------------------------------------------------------------
C:\Program Files\Microsoft SQL Server\MSSQL10.INSTANCE_NAME\MSSQL\Binn\sqlservr.config

(1 row(s) affected)

-------------------------------------------------------------------------
is a developer

(1 row(s) affected)