2011-03-17 4 views
4

클라이언트 용 코드 유지 관리 프로젝트의 일부로 SQL CLR 프로젝트를 상속 받았습니다. 나는 SQL CLR에 매우 익숙하지 않다는 것을 인정하지만, 어떻게 작동하는지 알아 내려고하고있다.SQL CLR 저장 프로 시저를 여러 서버에 배포하는 방법

필자는 데이터베이스 연결 문자열이 프로젝트의 속성에 저장되어 있으므로 필요하면 변경하는 방법을 알고 있습니다. 내가 가지고있는 한 가지 질문은 이것입니다 : 여러 SQL Server 인스턴스로 배포하기 위해 여러 연결 문자열을 설정할 수 있습니까? 제 경우에는 로컬 dev 머신, 스테이징 서버 및 프로덕션 서버 (각 서버에 대상 데이터베이스의 별도 복사본이 있음)가 있습니다. 연결 문자열을 변경하지 않고 각각에 대해 다시 빌드 할 필요없이 SQL CLR 어셈블리를 모두 3에 배포 할 수 있기를 바랍니다.

+0

문제는 조금 모호합니다. Visual Studio를 통해 SQL CLR 코드를 배포하는 방법에 대해 설명하고 싶다면 (코드를 해석하는 방법) 또는 코드 자체에 조정이 필요한 특정 연결 문자열 (gjvdkamp가 해석하는 방법)이있는 경우이를 명확히 할 수 있습니다. . 감사. –

답변

6

Visual Studio를 통한 개발은 어디에도 배포하지 말아야합니다. 따라서 프로젝트의 연결 문자열은 항상 개발자 환경을 가리켜 야합니다.

개발 서버에서 코드를 테스트 한 후에는 해당 어셈블리를 마우스 오른쪽 단추로 클릭하고 "Script Assembly As ..."및 "Create To ..."명령을 사용하여 SSMS에서 어셈블리를 스크립트 아웃 할 수 있습니다. 그런 다음 "새 쿼리 창". 이렇게하면 QA, 스테이징 및 프로덕션에 배포하는 데 사용해야하는 기본 스크립트가 제공됩니다.

일반적인 형식은 : 당신이 다치게하지 않습니다 그것을 원한다면하지만

USE [DBName] 
GO 

CREATE ASSEMBLY [AssemblyName] 
AUTHORIZATION [dbo] 
FROM 0x0000... 
WITH PERMISSION_SET = SAFE 

당신은 정말, 다른 환경에 어셈블리 파일을 전파 할 필요가 없습니다.

당신은 그것을 자동화 할 경우 기본 스크립트는 항상를 통해 업데이트 된 어셈블리 코드 (위 0000로 주목 무엇을) 잡아 수 있다는 것을 일단 : 완성도를 위해서 :

SELECT Content FROM sys.assembly_files WHERE name = 'AssemblyName' 

편집 Jeremy가 아래 주석에서 언급했듯이 위의 정보는 어셈블리 내의 코드에 액세스하는 래퍼 객체가 아니라 어셈블리 자체의 배포를 설명합니다. 전체 배포 프로세스는 다음과 같습니다

  1. 드롭 기존 래퍼 객체 (저장 프로세서 수, 함수, 트리거, 유형 및 집계)
  2. 가 드롭 총회는
  3. 새로운 조립
  4. 랩퍼를 작성 만들기
  5. 객체
+0

이 스크립트를 실행하고 어셈블리를 SSMS에 추가하면 CLR 어셈블리를 사용하는 스칼라 값 및 기타 함수를 스크립트 아웃해야 할 가능성이 높습니다. –

+0

@ JeremyThompson, 매우 사실이며 그 언급에 감사드립니다. 어셈블리에 초점을 맞추지 않고 답변을 업데이트했습니다. –

+0

정말 대단한 답이 아닙니다. 여러 가지 구성을 허용하지 않는 .NET 프로젝트 인 DB 프로젝트를위한 여러 배포 옵션을 쉽게 설정할 수 있습니다. 그러나 그 좋은 대답은 우리가 얻을 것입니다, 감사합니다 마이크로 소프트 :( – gbjbaanb

0

여기를보십시오 : The difference between the connections strings in SQLCLR 가능한 경우 컨텍스트 연결을 사용해야한다고 생각합니다. 그렇게하면 재구성 할 필요가 없습니다.

다른 자격 증명이나 다른 것이 필요한 경우 해당 설정을 보유하고있는 설정 테이블을 쿼리 할 수 ​​있습니다. 컨텍스트 연결을 사용하여 연결하고 설정 테이블을 쿼리하여 로그인 세부 정보를 얻은 다음 다시 사용하여 연결합니다.

또한 연결 문자열은 속성에 있지만 settings.xml이 배포되지 않으므로 기본값을 설정 클래스에 항상 하드 코딩 할 수 있습니다.

1

개발 서버에 코드를 배포하면 Visual Studio에서 bin/Release 폴더에 .sql 파일을 만듭니다.

배포에 유용 할 수 있습니다. 약간의 청소가 필요합니다.

다음은 VS에서 만든 스크립트에서 배포 스크립트를 가져 오는 데 사용하는 perl 스크립트입니다.

내 요구와 파일 형식 (VS 2010 SP1, SQL 2008 R2, cygwin에서 perl 사용)과 밀접하게 연결되어 있습니다. 예를 들어 모든 사람이 자동으로 작동하지 않을 수도 있습니다.

use strict; 
use warnings; 

use Text::Unidecode 'unidecode'; # http://search.cpan.org/dist/Text-Unidecode/ 

sub ProcessBlock($) 
{ 
    my $lines = $_[0]; 

    if ($lines =~ "Deployment script for") { return 0; } 
    if ($lines =~ "^SET ") { return 0; } 
    if ($lines =~ "^:") { return 0; } 
    if ($lines =~ "^USE ") { return 0; } 
    if ($lines =~ "^BEGIN TRANSACTION") { return 0; } 
    if ($lines =~ "extendedproperty") { return 0; } 
    if ($lines =~ "^PRINT ") { return 0; } 
    if ($lines =~ "#tmpErrors") { return 0; } 
    if ($lines =~ "^IF \@\@TRANCOUNT") { return 0; } 

    my $drop = $lines; 
    if ($drop =~ m/^DROP (FUNCTION|PROCEDURE) ([^ ]+);/m) 
    { 
     printf("if OBJECT_ID('$2') IS NOT NULL\n"); 
    } 
    elsif ($drop =~ m/^DROP ASSEMBLY \[([^ ]+)\];/m) 
    { 
     printf("IF EXISTS (SELECT 1 FROM sys.assemblies WHERE name = '$1')\n"); 
    } 

    printf($lines); 
    printf("GO\n"); 

    my $create = $lines; 
    if ($create =~ m/^CREATE PROCEDURE (\[[^]]+\])\.(\[[^]]+\])/m) 
    { 
     printf("GRANT EXECUTE ON $1.$2 TO PUBLIC\nGO\n"); 
    } 
    elsif ($create =~ m/^CREATE FUNCTION (\[[^]]+\])\.(\[[^]]+\]).*RETURNS .* TABLE /ms) 
    { 
     printf("GRANT SELECT ON $1.$2 TO PUBLIC\nGO\n"); 
    } 
    elsif ($create =~ m/^CREATE FUNCTION (\[[^]]+\])\.(\[[^]]+\])/m) 
    { 
     printf("GRANT EXECUTE ON $1.$2 TO PUBLIC\nGO\n"); 
    } 
} 



my $block=""; 

while (<>) 
{ 
    my $line = $_; 
    $line = unidecode($line); 
    if ($line =~ "^GO") 
    { 
     ProcessBlock($block); 
     $block = ""; 
    } 
    else 
    { 
     $block .= $line; 
    } 
} 

사용법 :

perl FixDeploy.pl <YourAssembly.sql> YourAssembly.Deploy.sql 
관련 문제