Как развернуть хранимую процедуру SQL CLR на нескольких серверах - PullRequest
4 голосов
/ 17 марта 2011

Я унаследовал проект SQL CLR как часть проекта обслуживания кода, над которым я работаю для клиента. Правда, я новичок в SQL CLR, поэтому пытаюсь понять, как он работает.

Я заметил, что строка подключения к базе данных хранится в свойствах проекта, поэтому я знаю, как ее изменить, если мне нужно. Однако у меня есть один вопрос: возможно ли установить несколько строк подключения для развертывания на нескольких экземплярах SQL Server? В моем случае у меня есть локальный компьютер разработчика, промежуточный сервер и рабочий сервер (с отдельной копией целевой базы данных на каждом сервере). Я хотел бы иметь возможность развернуть сборку SQL CLR на всех трех без необходимости изменения строки подключения и повторной сборки для каждой из них.

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

Вы не должны развертываться нигде, кроме разработки через Visual Studio, поэтому строка подключения в Project всегда должна указывать на вашу среду разработки.

После того, как вы протестировали код на сервере разработки, вы можете написать скриптИзвлеките сборку в SSMS, щелкнув правой кнопкой мыши соответствующую сборку и выполнив «Сборка сценария как ...», затем «Создать в ...», а затем «Окно нового запроса».Это даст вам основной сценарий, который следует использовать для развертывания в QA, Staging и Production.

Общий формат:

USE [DBName]
GO

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

На самом деле вам не нужно распространять сборкуФайлы в другие среды, хотя, если вы хотите, это не повредит.

Если вы хотите автоматизировать это, когда у вас есть этот базовый сценарий, вы всегда можете получить обновленный код сборки (который отмечен как 0x0000 выше) через:

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

Редактировать: Ради полноты, как Джереми упоминал в комментарии ниже, приведенная выше информация описывает только развертывание самой сборки, а не объектов-оболочек для доступа к коду внутриАссамблея.Полный процесс развертывания:

  1. Удаление существующих объектов-оболочек (хранимых процедур, функций, триггеров, типов и агрегатов)
  2. Удаление сборки
  3. Создание новогоСборка
  4. Создание объектов оболочки
1 голос
/ 14 марта 2012

При развертывании кода на сервере разработки Visual Studio создает файл .sql в папке bin / Release.

Это может быть полезно для развертывания, оно требует некоторой очистки.

Вот сценарий perl, который я использую для получения сценария развертывания из сценария, созданного VS.

Он тесно связан с моими потребностями и форматом файла (я использую VS 2010 SP1, SQL 2008 R2,Perl в Cygwin), рассмотрим это как пример, он может не работать автоматически для всех.

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
0 голосов
/ 17 марта 2011

Смотрите здесь: Разница между строками соединения в SQLCLR Я думаю, что вы должны использовать контекстное соединение, если это возможно. Таким образом, вам не нужно перенастраивать.

Если вам нужны другие учетные данные или что-то еще, вы можете запросить таблицу настроек, которая содержит эти настройки. Используйте контекстное соединение для подключения, запросите таблицу настроек, чтобы получить данные для входа, а затем используйте их для повторного подключения.

Также: строка подключения находится в свойствах, но, как я понимаю, файл settings.xml не развертывается, поэтому вы всегда будете получать значения по умолчанию, жестко закодированные в классе настроек.

...