我有很多SQLCLR函數和sprocs在我的MSSQL 2008數據庫中。調試和日誌記錄一直是個問題。我已經在直接的C#應用程序中使用了Microsoft企業庫日誌記錄應用程序塊,並且想知道它是(1)瘋狂還是(2)不可能將它分層到SQLCLR的東西中。我真的很喜歡使用配置文件爲不同的事件定義滾動文本日誌,事件日誌和SMTP輸出,所以如果有另一種方式這樣做,我全部耳朵...EntLib和SQLCLR?
謝謝。
我有很多SQLCLR函數和sprocs在我的MSSQL 2008數據庫中。調試和日誌記錄一直是個問題。我已經在直接的C#應用程序中使用了Microsoft企業庫日誌記錄應用程序塊,並且想知道它是(1)瘋狂還是(2)不可能將它分層到SQLCLR的東西中。我真的很喜歡使用配置文件爲不同的事件定義滾動文本日誌,事件日誌和SMTP輸出,所以如果有另一種方式這樣做,我全部耳朵...EntLib和SQLCLR?
謝謝。
它似乎是可能的。我不知道這是否可取。
一種替代方法是在代碼中定義一個跟蹤監聽器,這當然可以從數據庫讀取配置。另一種簡單的方法是將消息記錄到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)
我知道我們在Entlib團隊甚至從來沒有考慮過在SQL-CLR環境中使用它。所以你在這裏踏上了新的一步。 – 2011-03-01 04:59:35
@Chris,我也不推薦它。我只是用這個例子走了那麼遠,因爲它似乎錯了,我不得不去嘗試它。 – 2011-03-01 15:32:09