CLR Stored Procedures: como definir o esquema / proprietário?
Pergunta
Eu estou trabalhando em um CLR com base Linq procedimento armazenado por algum filtragem e manipulação complexa, que de outro modo exigiria um monte de confuso e código T-SQL mal performance, se implementadas de uma forma mais "tradicional" Stored Procedure.
Esse é um trabalho grande, mas não consigo encontrar como definir o esquema deste procedimento armazenado em fase de implantação, para uma melhor organização e separação dos objetos de banco de dados em módulos.
Todas as idéias?
Muito obrigado antecipadamente.
Solução
Quando você cria o procedimento fazendo referência a montagem você pode criar esse wrapper sendo possuído por qualquer esquema que você deseja. Consulte Este artigo MSDN sobre a implantação de procedimentos CLR armazenados para uma explicação passo a passo de como fazer implantar um procedimento armazenado. Ao alterar a instrução de procedimento criar para algo como:
CREATE SCHEMA foo
CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
Você pode agora ter um procedimento de propriedade do esquema foo
.
Outras dicas
UPDATE: No Visual Studio 2012 isso agora pode ser realizado através da janela de propriedades do projeto de um "SQL Server banco de dados do projeto." A propriedade relevante é "Default Schema" na guia "Configurações do projeto". Modificando este valor modifica o script de implantação gerado para colocar o nome do esquema na frente de funções, procedimentos armazenados, etc ... Certifique-se de adicionar um objeto de esquema para o seu projecto com o mesmo nome, ou você receberá erros de compilação.
Eu não sei qual a versão do Visual Studio que você está usando, mas quando você criar um CLR armazenados projeto procedimento no Visual Studio 2010, o projeto inclui dois scripts SQL:. PreDeploymentScript.sql e PostDeploymentScript.sql
Nós apenas usá-los para coisas maniuplate do jeito que queremos.
No script pré-implantação, temos algo parecido com isto:
-- 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
Em seguida, no script pós-implantação, temos o seguinte:
-- 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
Espero que ajude!