EntLib и SQLCLR? - PullRequest
       2

EntLib и SQLCLR?

1 голос
/ 24 февраля 2011

У меня в базе данных MSSQL 2008 довольно много SQLCLR-функций и sprocs. Отладка и ведение журнала всегда проблема. Я много раз использовал блокировку журнала приложений Microsoft Enterprise Library в простых приложениях на C #, и мне было интересно, было ли это (1) сумасшедшим или (2) невозможно наслоить это на SQLCLR. Мне действительно нравится использовать файл конфигурации для определения непрерывного текстового журнала, журнала событий и SMTP-вывода для различных событий, поэтому, если есть другой способ сделать это, у меня все уши ...

Спасибо.

1 Ответ

1 голос
/ 24 февраля 2011

Кажется, что это возможно.Я не знаю, целесообразно ли это.

Одной из альтернатив будет определение прослушивателя трассировки в коде, который, конечно, может считывать конфигурацию из базы данных.Другой вариант - просто записывать сообщения в таблицу SQL и использовать триггеры для включения уведомлений.

Мне также нужно задаться вопросом, является ли реальной ошибкой то, что в вашей базе данных хранятся циклы CLR, которые содержат так много бизнес-логики, чтоони требуют регистрации.Я большой поклонник бизнес-логики в своей базе данных, но я настороженно отношусь к хранимым процедурам CLR.

Если вы хотите использовать блоки корпоративного приложения, файл конфигурации для редактирования будет C: \ ProgramФайлы \ 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...