2011-01-19 62 views
5

Tôi đang làm việc với quy trình lưu trữ CLR bằng cách sử dụng VS2010. Tôi cần tạo kịch bản triển khai độc lập để cài đặt thủ tục này tại các máy chủ của khách hàng. Bây giờ tôi đang sử dụng Visual Studio mà tạo ra kịch bản như vậy khi tôi nhấn F5 và cố gắng gỡ lỗi SP trên máy chủ DB. Tập lệnh này được đặt tại bin\Debug\MyStoredProcedure.sql tệp. Có vẻ như sau:Cách tạo tập lệnh cài đặt thủ tục lưu trữ SQL CLR w/o Visual Studio

USE [$(DatabaseName)] 

GO 
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors 
GO 
CREATE TABLE #tmpErrors (Error int) 
GO 
SET XACT_ABORT ON 
GO 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
GO 
BEGIN TRANSACTION 
GO 
PRINT N'Dropping [dbo].[spMyStoredProcedure]...'; 


GO 
DROP PROCEDURE [dbo].[spMyStoredProcedure]; 


GO 
IF @@ERROR <> 0 
    AND @@TRANCOUNT > 0 
    BEGIN 
     ROLLBACK; 
    END 

IF @@TRANCOUNT = 0 
    BEGIN 
     INSERT INTO #tmpErrors (Error) 
     VALUES     (1); 
     BEGIN TRANSACTION; 
    END 


GO 
PRINT N'Dropping [MyStoredProcedure]...'; 


GO 
DROP ASSEMBLY [MyStoredProcedure]; 


GO 
IF @@ERROR <> 0 
    AND @@TRANCOUNT > 0 
    BEGIN 
     ROLLBACK; 
    END 

IF @@TRANCOUNT = 0 
    BEGIN 
     INSERT INTO #tmpErrors (Error) 
     VALUES     (1); 
     BEGIN TRANSACTION; 
    END 


GO 
PRINT N'Creating [MyStoredProcedure]...'; 


GO 
CREATE ASSEMBLY [MyStoredProcedure] 
    AUTHORIZATION [dbo] 
-- here should be long hex string with assembly binary 
    FROM 0x4D5A90000300000004000000FFFCD21546869732070726F6772616D...000000000000000000 
    WITH PERMISSION_SET = SAFE; 


GO 
IF @@ERROR <> 0 
    AND @@TRANCOUNT > 0 
    BEGIN 
     ROLLBACK; 
    END 

IF @@TRANCOUNT = 0 
    BEGIN 
     INSERT INTO #tmpErrors (Error) 
     VALUES     (1); 
     BEGIN TRANSACTION; 
    END 


GO 
PRINT N'Creating [dbo].[spMyStoredProcedure]...'; 


GO 
CREATE PROCEDURE [dbo].[spMyStoredProcedure] 
@reference UNIQUEIDENTIFIER, @results INT OUTPUT, @errormessage NVARCHAR (4000) OUTPUT 
AS EXTERNAL NAME [MyStoredProcedure].[MyCompany.MyProduct.MyStoredProcedureClass].[MyStoredProcedureMethod] 


GO 
IF @@ERROR <> 0 
    AND @@TRANCOUNT > 0 
    BEGIN 
     ROLLBACK; 
    END 

IF @@TRANCOUNT = 0 
    BEGIN 
     INSERT INTO #tmpErrors (Error) 
     VALUES     (1); 
     BEGIN TRANSACTION; 
    END 


GO 
IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION 
GO 
IF @@TRANCOUNT>0 BEGIN 
PRINT N'The transacted portion of the database update succeeded.' 
COMMIT TRANSACTION 
END 
ELSE PRINT N'The transacted portion of the database update failed.' 
GO 
DROP TABLE #tmpErrors 
GO 

Tôi tự hỏi, có thể tạo tập lệnh như vậy mà không có Visual Studio không? Ví dụ, nếu tôi xây dựng giải pháp với MSBuild và sau đó tạo tập lệnh này với một số công cụ? Tôi tin rằng, nếu tôi đọc lắp ráp như mảng byte và sau đó serialize nó vào chuỗi hex và chèn vào mẫu kịch bản - nó có thể làm việc, nhưng có lẽ có một số giải pháp tiêu chuẩn dễ dàng hơn?

Cảm ơn.

Trả lời

3

Vâng, có vẻ như cách duy nhất là đọc lắp ráp dưới dạng tệp nhị phân và sau đó tạo tập lệnh bằng mẫu ở trên. Một cái gì đó như thế:

  using (var str = File.OpenRead(pathToAssembly)) 
      { 
       int count = 0; 
       do 
       { 
        var buffer = new byte[1024]; 
        count = str.Read(buffer, 0, 1024); 

        for (int i = 0; i < count; i++) 
        { 
         hexStringBuilder.Append((buffer[i] >> 4).ToString("X")); 
         hexStringBuilder.Append((buffer[i] & 0xF).ToString("X")); 
        } 
       } while (count > 0); 
      } 
      // generate script using template from initial question 

Tôi đã kiểm tra phương pháp này và nó hoạt động.

+0

Điều này là tuyệt vời và nhanh hơn nhiều so với cố gắng để 'FROM 'C: \ FilePath'', Tôi cũng phải thêm '0x' vào hex như trong' FROM 0xhexWithoutQuotes'. –

1

Những gì bạn đã mô tả sẽ hoạt động tốt nhưng như là Deploying CLR Database Objects mô tả nó có vẻ dễ dàng hơn chỉ để tham khảo Dll đã biên dịch.

Để triển khai việc lắp ráp sử dụng Transact-SQL

Compile lắp ráp từ các nguồn tập tin bằng cách sử dụng dòng lệnh trình biên dịch kèm với .NET Framework.

Đối với Microsoft file Visual C# source:

csc/target: thư viện C: \ helloworld.cs

Đối với Microsoft Visual Basic nguồn file:

VBC/target: thư viện C: \ helloworld.vb

Các lệnh này khởi chạy trình biên dịch Visual C# hoặc Visual Basic bằng cách sử dụng tùy chọn /đích để chỉ định tòa nhà l ibrary DLL.

Giải quyết tất cả lỗi xây dựng và cảnh báo trước khi triển khai lắp ráp vào máy chủ kiểm tra .

Mở SQL Server Management Studio trên máy chủ thử nghiệm. Tạo truy vấn mới, được kết nối với cơ sở dữ liệu kiểm tra phù hợp (chẳng hạn như AdventureWorks2008R2).

Tạo lắp ráp trong máy chủ bằng cách thêm Transact-SQL sau đây vào truy vấn.

CREATE HỘI HelloWorld từ 'c: \ helloworld.dll' VỚI PERMISSION_SET = AN TOÀN

Thủ tục, chức năng, tổng hợp, kiểu người dùng định nghĩa, hoặc kích hoạt phải sau đó được tạo ra trong trường hợp của SQL Máy chủ. Nếu assembly HelloWorld chứa một phương thức có tên HelloWorld trong lớp Procedures, thì Transact-SQL sau có thể được thêm vào truy vấn để tạo một thủ tục gọi là hello trong SQL Server.

CREATE PROCEDURE chào

AS

EXTERNAL TÊN HelloWorld.Procedures.HelloWorld

+0

tôi biết về giải pháp này, nhưng nó không được áp dụng - khách hàng của chúng tôi muốn để có tập lệnh triển khai một tệp. –

+0

@Victor ah. sau đó có tôi nghĩ rằng bạn đã có nó với "Tôi đọc lắp ráp như mảng byte và sau đó serialize nó vào chuỗi hex và chèn vào mẫu kịch bản -" –

0

Bạn có thể lấy nhị phân lắp ráp từ sys.assembly_files. Có lẽ bạn có thể làm điều gì đó với điều đó.

select * 
from sys.assembly_files 
3

Cách khác, giả sử bạn có lắp ráp được triển khai trực tiếp từ studio trực quan đến một số máy chủ SQL thử nghiệm; tạo ra một kịch bản triển khai độc lập bằng cách kích chuột phải vào lắp ráp trong SSMS (studio quản lý) và chọn:

Script lắp ráp như -> Create Để ...

này sẽ viết chuỗi hex đại diện cho DLL cho bạn trong một kịch bản lệnh SQL bạn có thể sử dụng cho một triển khai tập tin duy nhất.

0

đọc this bưu chính, thay vì sử dụng /Hành động: Xuất bản sử dụng /Hành động: Script /OutputPath:D:\deploymentScript.sql

Các vấn đề liên quan