Настройка центральной библиотеки хранимых процедур / функций CLR для внутренних хранимых процедур в других базах данных?

17

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

Есть ли лучший способ сделать это с точки зрения администрирования и безопасности? Функции CLR очень просты, такие как разрыв строки, проверка электронной почты, url en / decode, base64 и т. Д. Мне бы хотелось, чтобы только схема dbo в каждой базе данных имела доступ к функциям.

  1. Есть ли простой способ сделать это?
  2. Также мне не ясно, встроена ли библиотека CLR, и если я перемещаю базу данных, она помечается, или мне тоже нужно перемещать библиотеку DLL.

Благодарность

Алекс Эрвин
источник
1
Окей, звучит хорошо. Пока я не слышу сверчков из мертвого молчания по этому вопросу. Всегда было везение в stackoverflow
Алекс Эрвин
1
dba.se менее взбешен, чем SO, но я уверен, что вы получите хорошее внимание на такой вопрос в течение дня или около того. Вы счастливы быть терпеливым так долго?
Джек Дуглас
Lol, терпение это добродетель. У меня их достаточно, и сам вопрос, я думаю, MS рассмотрит. Что делать, если вы являетесь хостом SQL Server, который хочет предоставить некоторые полезные функции, но при этом ваш сервер не будет полностью открыт для CLR?
Алекс Эрвин

Ответы:

8

В нашей компании у нас есть такая точная настройка. Когда вы создаете сборку CLR, двоичное представление сборки сохраняется в базе данных, в которой вы ее создаете. Это позволяет вам взять ее с собой (и даже создать сценарий), если вы переместите базу данных в любой момент времени.

Пару месяцев назад наш дата-центр был затоплен - на нем было много серверов. Когда я перестраивал их, я использовал только те резервные копии базы данных, которые были сделаны прошлой ночью. До сих пор у нас не было никаких проблем .. (коснитесь дерева!)

Я не уверен, что это правильно с точки зрения безопасности, но способ предоставления доступа к процессам CLR и т. Д. Заключается в создании роли в общей базе данных, а затем добавлении пользователей из других баз данных в эту роль. Роль затем предоставляется выполнить на процессах CLR.

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

http://msdn.microsoft.com/en-us/library/ms345101.aspx

Я надеюсь, что это поможет вам.

Mr.Brownstone
источник
6

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

В любом случае, почему вы пытаетесь это сделать?

(Я не пытаюсь спорить; я просто хочу услышать мотивы, связанные с этим, потому что, возможно, проблему можно решить другим способом, отвечающим вашим потребностям.)


Нет никакого способа сделать это легко, кроме как поместить сборку в общую базу данных.

Тем не менее, я думаю, что было бы выгодно использовать архитектуру, ориентированную на базы данных, если только в конкретной ситуации нет веских причин для централизации. Причина в том, что размещение сборки (или чего-либо в этом роде) вне базы данных создает зависимость в вашей среде. Это как раз противоположный подход, к которому Microsoft прибегает с помощью автономных баз данных, начиная с SQL Server 2012.

  • Когда вы начинаете нуждаться в использовании таких функций, как репликация или кластеризация, эта зависимость потенциально может значительно усложнить развертывание, а также устранение неполадок и процедуры восстановления после отказа.

  • Эта архитектура гораздо менее очевидна для людей, незнакомых с системой (т. Е. Она менее самообнаруживаема и менее самодокументирована).

  • Если вам в конечном итоге потребуется разная защита в разных базах данных или что-то, что связано с вариациями, вы окажетесь в мире боли.

  • Если эти базы данных будут развернуты для клиентов (звучит так, как будто они не будут, но я скажу это для полноты), это усложнит процедуру развертывания, обслуживания и устранения неполадок.

  • Поскольку все базы данных будут совместно использовать этот код, если какие-либо ошибки будут введены (или исправлены!), Это может потенциально сломать все приложения, которые полагаются на базы данных. Комплексное модульное тестирование будет абсолютной необходимостью.

Если у вас есть несколько баз данных, которые нуждаются в одной и той же функциональности, есть другие способы уменьшить количество дублирования, которое, как я полагаю, является целью упражнения. Даже довольно сложная сборка CLR не займет много физического пространства хранения по сравнению с данными в самой базе данных (почти всегда), поэтому я не считаю это допустимым аргументом, если у вас нет буквально тысяч крошечных баз данных, которые нуждаются в этом сборка.

Что вы можете сделать, это изменить другие части процедуры развертывания для этих баз данных, чтобы уменьшить дублирование источника. Например, соберите и разверните сборку из общего расположения кода CLR в системе управления версиями. Или создайте сценарий, который развертывает ту же сборку в базах данных. Автоматизируйте эту часть как можно больше, и это не будет иметь большого значения.

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

Джон Сайгель
источник
Я вижу вашу точку зрения в том, что возможно что-то сломается, но это упрощение развертывания кода. Здесь нет армии разработчиков. Просто я. Однако у меня есть другие, использующие базу данных, поэтому мне нужно убедиться, что функции недоступны, если они не используются из хранимых процедур, которые я определяю.
Алекс Эрвин
1

Как и другие два ответа правильно состояния, сборки загружаются в конкретной базе данных и не в масштабах всей системы (хотя я абсолютно уверен , что assembly_idзначение является уникальным для всей системы). Это означает, что они резервируются и восстанавливаются для каждой базы данных, в которую они загружены.

Кроме того, настройка enabled/ (через ) является общесистемной. Отметим, что этот параметр предназначен только для пользовательских функций CLR; CLR в общем смысле всегда включен, поскольку от него зависят определенные встроенные функции.disabledCLR Integrationsp_configure

Тем не менее, в то время как два других ответа здесь дают действительные баллы, эти баллы не являются специфичными для SQLCLR, и нет никаких упоминаний о факторах, принимающих это решение, которые специфичны для кода SQLCLR. Есть проблемы с памятью, которые следует учитывать при развертывании кода в каждой отдельной базе данных (при условии, что у вас много баз данных), потенциальные проблемы нехватки ресурсов, потенциальные проблемы, связанные с безопасностью, и т. Д.

Я предоставил полный перечень вещей, которые следует иметь в виду, особенно для кода SQLCLR, при выборе между централизованной базой данных и отдельной базой данных. Вместо того, чтобы дублировать список здесь, пожалуйста, смотрите следующий ответ (также здесь, на DBA.SE):

Как лучше использовать функцию CLR с точки зрения производительности (повторять внутри каждой БД или иметь общую функцию)?

Кроме того, в соответствующей заметке я хотел бы задать вопрос, почему для любой базы данных устанавливается значение TRUSTWORTHY ON. Функциональность, отмеченная в Вопросе (т. Е. «Разрыв строки, проверка электронной почты, url en / decode, base64 и т. Д.»), Возможна в SAFEсборке. Вы не должны использовать значения EXTERNAL_ACCESSили UNSAFEperission_set без крайней необходимости. И если это необходимо для некоторого числа функций, то они должны быть в отдельной сборке, которая содержит только SAFEкод, так что любые скалярные функции, которые не осуществляют доступ к данным и помечены как IsDeterministic = trueсмогут использовать преимущество в производительности, будучи возможность участвовать в параллельных планах.

Соломон Руцкий
источник