Я хотел бы использовать код, который я разработал в C # CLR, для использования во всех базах данных в системе, чтобы мне не приходилось устанавливать каждую из них на достоверную, включать CLR и хранить кучу одного и того же кода внутри каждой из них. ,
Есть ли лучший способ сделать это с точки зрения администрирования и безопасности? Функции CLR очень просты, такие как разрыв строки, проверка электронной почты, url en / decode, base64 и т. Д. Мне бы хотелось, чтобы только схема dbo в каждой базе данных имела доступ к функциям.
- Есть ли простой способ сделать это?
- Также мне не ясно, встроена ли библиотека CLR, и если я перемещаю базу данных, она помечается, или мне тоже нужно перемещать библиотеку DLL.
Благодарность
sql-server
sql-server-2008
sql-server-2008-r2
c#
sql-clr
Алекс Эрвин
источник
источник
Ответы:
В нашей компании у нас есть такая точная настройка. Когда вы создаете сборку CLR, двоичное представление сборки сохраняется в базе данных, в которой вы ее создаете. Это позволяет вам взять ее с собой (и даже создать сценарий), если вы переместите базу данных в любой момент времени.
Пару месяцев назад наш дата-центр был затоплен - на нем было много серверов. Когда я перестраивал их, я использовал только те резервные копии базы данных, которые были сделаны прошлой ночью. До сих пор у нас не было никаких проблем .. (коснитесь дерева!)
Я не уверен, что это правильно с точки зрения безопасности, но способ предоставления доступа к процессам CLR и т. Д. Заключается в создании роли в общей базе данных, а затем добавлении пользователей из других баз данных в эту роль. Роль затем предоставляется выполнить на процессах CLR.
Могут быть проблемы с доступом, если CLR пытается выполнить такие действия, как доступ к ресурсам вне базы данных, в которой она содержится, но вы можете установить разрешение для сборки при ее создании. Ссылка ниже имеет гораздо больше информации о разрешениях, чем я могу объяснить здесь:
http://msdn.microsoft.com/en-us/library/ms345101.aspx
Я надеюсь, что это поможет вам.
источник
Двоичный файл сборки хранится в базе данных как большой двоичный объект, поэтому он переносится куда угодно. CLR включается только для экземпляра - для этого нет настроек, специфичных для базы данных.
В любом случае, почему вы пытаетесь это сделать?
(Я не пытаюсь спорить; я просто хочу услышать мотивы, связанные с этим, потому что, возможно, проблему можно решить другим способом, отвечающим вашим потребностям.)
Нет никакого способа сделать это легко, кроме как поместить сборку в общую базу данных.
Тем не менее, я думаю, что было бы выгодно использовать архитектуру, ориентированную на базы данных, если только в конкретной ситуации нет веских причин для централизации. Причина в том, что размещение сборки (или чего-либо в этом роде) вне базы данных создает зависимость в вашей среде. Это как раз противоположный подход, к которому Microsoft прибегает с помощью автономных баз данных, начиная с SQL Server 2012.
Когда вы начинаете нуждаться в использовании таких функций, как репликация или кластеризация, эта зависимость потенциально может значительно усложнить развертывание, а также устранение неполадок и процедуры восстановления после отказа.
Эта архитектура гораздо менее очевидна для людей, незнакомых с системой (т. Е. Она менее самообнаруживаема и менее самодокументирована).
Если вам в конечном итоге потребуется разная защита в разных базах данных или что-то, что связано с вариациями, вы окажетесь в мире боли.
Если эти базы данных будут развернуты для клиентов (звучит так, как будто они не будут, но я скажу это для полноты), это усложнит процедуру развертывания, обслуживания и устранения неполадок.
Поскольку все базы данных будут совместно использовать этот код, если какие-либо ошибки будут введены (или исправлены!), Это может потенциально сломать все приложения, которые полагаются на базы данных. Комплексное модульное тестирование будет абсолютной необходимостью.
Если у вас есть несколько баз данных, которые нуждаются в одной и той же функциональности, есть другие способы уменьшить количество дублирования, которое, как я полагаю, является целью упражнения. Даже довольно сложная сборка CLR не займет много физического пространства хранения по сравнению с данными в самой базе данных (почти всегда), поэтому я не считаю это допустимым аргументом, если у вас нет буквально тысяч крошечных баз данных, которые нуждаются в этом сборка.
Что вы можете сделать, это изменить другие части процедуры развертывания для этих баз данных, чтобы уменьшить дублирование источника. Например, соберите и разверните сборку из общего расположения кода CLR в системе управления версиями. Или создайте сценарий, который развертывает ту же сборку в базах данных. Автоматизируйте эту часть как можно больше, и это не будет иметь большого значения.
Я согласен, что то, что я предлагаю, это компромисс, потому что все еще будет некоторое дублирование, но это должно быть сбалансировано с недостатками, связанными с реализацией архитектуры, которая не следует предписанному стандарту. Только вы можете решить, что подходит для вашей среды.
источник
Как и другие два ответа правильно состояния, сборки загружаются в конкретной базе данных и не в масштабах всей системы (хотя я абсолютно уверен , что
assembly_id
значение является уникальным для всей системы). Это означает, что они резервируются и восстанавливаются для каждой базы данных, в которую они загружены.Кроме того, настройка
enabled
/ (через ) является общесистемной. Отметим, что этот параметр предназначен только для пользовательских функций CLR; CLR в общем смысле всегда включен, поскольку от него зависят определенные встроенные функции.disabled
CLR Integration
sp_configure
Тем не менее, в то время как два других ответа здесь дают действительные баллы, эти баллы не являются специфичными для SQLCLR, и нет никаких упоминаний о факторах, принимающих это решение, которые специфичны для кода SQLCLR. Есть проблемы с памятью, которые следует учитывать при развертывании кода в каждой отдельной базе данных (при условии, что у вас много баз данных), потенциальные проблемы нехватки ресурсов, потенциальные проблемы, связанные с безопасностью, и т. Д.
Я предоставил полный перечень вещей, которые следует иметь в виду, особенно для кода SQLCLR, при выборе между централизованной базой данных и отдельной базой данных. Вместо того, чтобы дублировать список здесь, пожалуйста, смотрите следующий ответ (также здесь, на DBA.SE):
Как лучше использовать функцию CLR с точки зрения производительности (повторять внутри каждой БД или иметь общую функцию)?
Кроме того, в соответствующей заметке я хотел бы задать вопрос, почему для любой базы данных устанавливается значение
TRUSTWORTHY ON
. Функциональность, отмеченная в Вопросе (т. Е. «Разрыв строки, проверка электронной почты, url en / decode, base64 и т. Д.»), Возможна вSAFE
сборке. Вы не должны использовать значенияEXTERNAL_ACCESS
илиUNSAFE
perission_set без крайней необходимости. И если это необходимо для некоторого числа функций, то они должны быть в отдельной сборке, которая содержит толькоSAFE
код, так что любые скалярные функции, которые не осуществляют доступ к данным и помечены какIsDeterministic = true
смогут использовать преимущество в производительности, будучи возможность участвовать в параллельных планах.источник