2009-05-13 14 views
7

Sto lavorando su una procedura memorizzata CLR basata su Linq per alcuni filtri e manipolazioni complesse, che altrimenti richiederebbero molto codice T-SQL disordinato e scarsamente performante, se implementato in una stored procedure più "tradizionale".Procedure memorizzate CLR: come impostare lo schema/proprietario?

Questo funziona benissimo, ma non riesco a trovare come impostare lo schema di questa stored procedure nella fase di distribuzione, per una migliore organizzazione e separazione degli oggetti del database nei moduli.

Qualche idea?

Molte grazie in anticipo.

+0

Questa richiesta, per quanto riguarda l'impostazione dello schema nella distribuzione Visual Studio/SSDT, è obsoleta a partire da VS 2012. Vedere la sezione ** AGGIORNA ** nella parte superiore di questa risposta di seguito: http: // stackoverflow.com/a/4597610/577765 –

risposta

2

Quando si crea la procedura facendo riferimento all'assieme, è possibile creare questo wrapper che appartiene a qualsiasi schema desiderato. Vedere This MSDN article on deploying CLR stored procedures per una procedura dettagliata su come eseguire una procedura memorizzata. Cambiando l'istruzione CREATE PROCEDURE a qualcosa di simile:

CREATE SCHEMA foo 

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

È ora possibile avere una procedura di proprietà del foo schema.

+0

Molte grazie. Ho trovato quell'articolo e posso vederlo come una soluzione, ma mi chiedevo se ci sono altre alternative che non richiedono un wrapper o comunque un secondo oggetto. Ne sei a conoscenza o è questa l'unica possibilità attuale? Ancora una volta, grazie per la pronta risposta :) –

+0

Il wrapper SQL è una parte necessaria. Devi farlo comunque - è parte integrante della distribuzione delle procedure memorizzate CLR. – ConcernedOfTunbridgeWells

+0

Molte grazie e scusa per il ritardo, sono stato impegnato con qualcos'altro nel frattempo. Non sto distribuendo più direttamente da Visual Studio. Invece, sto distribuendo tramite script, così posso più facilmente specificare lo schema che voglio usando un wrapper, come suggerito. Molte grazie ancora per il vostro aiuto. –

9

UPDATE: In Visual Studio 2012 questo può ora essere eseguito tramite la finestra delle proprietà del progetto di un "Progetto database SQL Server". La relativa proprietà è "Schema predefinito" nella scheda "Impostazioni progetto". La modifica di questo valore modifica lo script di distribuzione generato per mettere il nome dello schema davanti a funzioni, stored procedure, ecc. Assicurarsi di aggiungere un oggetto schema al progetto con lo stesso nome o si otterranno errori di compilazione.


Non so quale versione di Visual Studio che si sta utilizzando, ma quando si crea un progetto di CLR memorizzato procedure in Visual Studio 2010, il progetto prevede due script SQL: PreDeploymentScript.sql e PostDeploymentScript.sql.

Li usiamo solo per manipolare le cose nel modo in cui vogliamo.

Nello script pre-distribuzione, abbiamo qualcosa di simile:

-- 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 

Poi, nello script post-distribuzione, abbiamo questa:

-- 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 

Speranza che aiuta!

Problemi correlati