문제

나는 일부 복잡한 필터링 및 조작에 대한 LINQ 기반 CLR 저장 절차를 연구하고 있습니다. 그렇지 않으면보다 "전통적인"저장된 절차로 구현 된 경우 지저분하고 성능이 저조한 T-SQL 코드가 많이 필요합니다.

이것은 잘 작동하지만 모듈에서 데이터베이스 개체를 더 나은 구성 및 분리하기 위해 배포 단계 에서이 저장 프로 시저의 스키마를 설정하는 방법을 찾을 수 없습니다.

어떤 아이디어?

미리 감사드립니다.

도움이 되었습니까?

해결책

어셈블리를 참조하는 절차를 만들 때 원하는 스키마가 소유 한이 래퍼를 만들 수 있습니다. 보다 CLR 저장 절차 배포에 관한이 MSDN 기사 저장된 절차를 배포하는 방법에 대한 연습. 프로 시저 작성 명령문을 다음과 같은 것으로 변경함으로써

CREATE SCHEMA foo

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

이제 소유 한 절차를 가질 수 있습니다 foo 개요.

다른 팁

업데이트: Visual Studio 2012에서는 이제 "SQL Server 데이터베이스 프로젝트"의 프로젝트 속성 창을 통해 달성 할 수 있습니다. 관련 속성은 "프로젝트 설정"탭의 "기본 스키마"입니다. 이 값을 수정하면 생성 된 배포 스크립트를 수정하여 스키마 이름을 함수 앞에, 저장 프로 시저 등에 넣습니다 ... 동일한 이름으로 프로젝트에 스키마 개체를 추가하거나 빌드 오류가 발생합니다.


어떤 버전의 Visual Studio를 사용하고 있는지 모르겠지만 Visual Studio 2010에서 CLR 저장 프로 시저 프로젝트를 만들 때 프로젝트에는 predeploymentscript.sql 및 postdeploymentscript.sql의 두 가지 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