Вопрос

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

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

Есть какие-нибудь идеи?

Заранее большое спасибо.

Это было полезно?

Решение

Когда вы создаете процедуру, ссылающуюся на сборку, вы можете создать эту оболочку, принадлежащую любой схеме, которую вы хотите.Видишь Эта статья MSDN о развертывании хранимых процедур CLR для пошагового руководства о том, как выполнить развертывание хранимой процедуры.Изменив инструкцию create procedure на что-то вроде:

CREATE SCHEMA foo

CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld

Теперь у вас может быть процедура, принадлежащая foo схема.

Другие советы

Обновить: В Visual Studio 2012 это теперь можно выполнить через окно свойств проекта "Проект базы данных SQL Server". Соответствующим свойством является "Схема по умолчанию" на вкладке "Настройки проекта".Изменение этого значения изменяет сгенерированный сценарий развертывания, помещая имя схемы перед Функциями, Хранимыми процедурами и т.д...Обязательно добавьте объект схемы в свой проект с тем же именем, иначе вы получите ошибки сборки.


Я не знаю, какую версию Visual Studio вы используете, но когда вы создаете проект хранимой процедуры CLR в Visual Studio 2010, проект включает в себя два SQL-скрипта:PreDeploymentScript.sql и PostDeploymentScript.sql.

Мы просто используем их, чтобы манипулировать вещами так, как мы хотим.

В сценарии предварительного развертывания у нас есть что-то вроде этого:

-- DROP EXISTING ITEM FROM CURRENT SCHEMA
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Utilities].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [Utilities].[fn_Create_Md5_Hash]
GO

Затем, в сценарии после развертывания, у нас есть это:

-- DEPLOYMENT WIZARD RECREATES ITEM IN dbo SCHEMA
-- DROP NEW ITEM FROM dbo SCHEMA
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fn_Create_Md5_Hash]
GO

-- RECREATE THE ITEM BACK IN THE SCHEMA YOU WANT
CREATE FUNCTION [Utilities].[fn_Create_Md5_Hash](@source [varbinary](max))
RETURNS [varbinary](8000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [NameSpace].[UserDefinedFunctions].[fn_Create_Md5_Hash]
GO

Надеюсь, это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top