2011-02-24 49 views
1

我有很多SQLCLR函數和sprocs在我的MSSQL 2008數據庫中。調試和日誌記錄一直是個問題。我已經在直接的C#應用​​程序中使用了Microsoft企業庫日誌記錄應用程序塊,並且想知道它是(1)瘋狂還是(2)不可能將它分層到SQLCLR的東西中。我真的很喜歡使用配置文件爲不同的事件定義滾動文本日誌,事件日誌和SMTP輸出,所以如果有另一種方式這樣做,我全部耳朵...EntLib和SQLCLR?

謝謝。

回答

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) 
+0

我知道我們在Entlib團隊甚至從來沒有考慮過在SQL-CLR環境中使用它。所以你在這裏踏上了新的一步。 – 2011-03-01 04:59:35

+1

@Chris,我也不推薦它。我只是用這個例子走了那麼遠,因爲它似乎錯了,我不得不去嘗試它。 – 2011-03-01 15:32:09