2011-02-24 2 views
1

필자는 MSSQL 2008 DB에 SQLCLR 함수와 sprocs를 많이 가지고 있습니다. 디버깅 및 로깅은 항상 문제입니다. Microsoft Enterprise Library Logging Application Block을 사용하여 C# 응용 프로그램을 많이 사용하고 있었고 (1) 미친 지 또는 (2) SQLCLR 항목에 레이어링 할 수 없는지 궁금합니다. 나는 정말로 다른 이벤트가 있기 때문에 롤링 텍스트 로그, 이벤트 로그 및 SMTP 출력을 정의하기 위해 설정 파일을 사용하고 싶습니다. 그래서 다른 방법이 있다면, 나는 모든 귀입니다. ...EntLib 및 SQLCLR?

감사합니다.

답변

1

가능한 것처럼 보입니다. 내가 권할 지 모르겠다.

하나의 대안은 데이터베이스에서 구성을 읽을 수있는 코드에서 추적 수신기를 정의하는 것입니다. 또 다른 방법은 메시지를 SQL 테이블에 로깅하고 트리거를 사용하여 알림을 활성화하는 것입니다.

또한 실제 실수로 인해 로깅이 필요한 많은 비즈니스 로직을 가진 데이터베이스에 procs가 저장되어 있는지 여부에 대해 질문해야합니다. 저는 제 데이터베이스의 비즈니스 로직을 좋아합니다.하지만 CLR에 저장된 procs는주의해야합니다.

엔터프라이즈 응용 프로그램 블록을 사용하려는 경우 편집 할 구성 파일은 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 사용하여 실행 :

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

(1 row(s) affected) 

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

(1 row(s) affected) 
:

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') 

이 나에게 다음과 같은 결과를 주었다를

+0

우리는 Entlib 팀에서 SQL-CLR 환경에서 사용 된 적이 없다고 생각합니다. 그래서 당신은 여기에 새로운 지평을 걷고 있습니다. –

+1

@Chris, 나도 추천하지 않습니다. 나는 그것을 시험해 봐야했다는 것이 너무 잘못 보였기 때문에 나는 그 예와 함께 그저 멀리까지 갔다. –

관련 문제