Làm thế nào để kịch bản ra tạo đăng ký đẩy tại thuê bao?


7

Tôi đang cố gắng thiết lập đăng ký đẩy cho ấn phẩm SQL Server từ người đăng ký.

Tôi có thể thiết lập đăng ký tại nhà xuất bản bằng Trình hướng dẫn sao chép trong Studio quản lý. Tuy nhiên, tôi muốn kịch bản quá trình liên quan đến thuê bao để tôi có thể tự động hóa việc triển khai một cá thể thuê bao SQL Server mới.

Ban đầu, tôi rất vui khi được nhắc tên nhà xuất bản trước khi triển khai. Nếu tôi có thể làm việc này, tôi sẽ tìm cách tự động đưa giá trị chính xác cho môi trường của mình.

Cách đơn giản để thực hiện việc này đối với phiên bản SQL Server phải tạo nhiều đăng ký tại các nhà xuất bản khác nhau là gì?

Tôi sẵn sàng sử dụng bất kỳ giải pháp kịch bản SQL Server được hỗ trợ nào : SMO, RMO, Sqlcmd, WMI, PSDrive, thậm chí là T-SQL thuần túy.

Tôi đã cố gắng giải quyết vấn đề này theo hai cách. Đầu tiên là một giải pháp hoàn chỉnh sử dụng T-SQL, nhưng nó bao gồm một số bước thủ công.

Sử dụng T-SQL

Tôi có một giải pháp thủ công trong T-SQL. Giải pháp này dựa trên đầu ra của đầu ra Trình tạo tập lệnh nhân rộng Studio quản lý.

Sử dụng Management Studio, tôi chạy tập lệnh sau để tạo tập lệnh T-SQL mà tôi có thể chạy tại nhà xuất bản:

PRINT N'
EXECUTE MyDatabase.dbo.sp_addsubscription
  @publication = N''MyPublication'',
  @subscriber = ''' + CAST(SERVERPROPERTY('ServerName') AS SYSNAME) + ''',
  @destination_db = ''SubscriberDatabase'',
  @subscription_type = N''Push'',
  @sync_type = N''automatic'',
  @article = N''all'',
  @update_mode = N''read only'',
  @subscriber_type = 0;

EXECUTE MyDatabase.dbo.sp_addpushsubscription_agent
  @publication = N''MyPublication'',
  @subscriber = ''' + CAST(SERVERPROPERTY('ServerName') AS SYSNAME) + ''',
  @subscriber_db = ''SubscriberDatabase'',
  @job_login = null,
  @job_password = null,
  @subscriber_security_mode = 1,
  @frequency_type = 64,
  @frequency_interval = 1,
  @frequency_relative_interval = 1,
  @frequency_recurrence_factor = 0,
  @frequency_subday = 4,
  @frequency_subday_interval = 5,
  @active_start_time_of_day = 0,
  @active_end_time_of_day = 235959,
  @active_start_date = 0,
  @active_end_date = 0,
  @dts_package_location = N''Distributor'';';

Trong trường hợp MYSUBSCRIBER, đầu ra sẽ như thế này:

EXECUTE MyDatabase.dbo.sp_addsubscription
  @publication = N'MyPublication',
  @subscriber = 'MYSUBSCRIBER',
  @destination_db = 'SubscriberDatabase',
  @subscription_type = N'Push',
  @sync_type = N'automatic',
  @article = N'all',
  @update_mode = N'read only',
  @subscriber_type = 0;

EXECUTE MyDatabase.dbo.sp_addpushsubscription_agent
  @publication = N'MyPublication',
  @subscriber = 'MYSUBSCRIBER',
  @subscriber_db = 'SubscriberDatabase',
  @job_login = null,
  @job_password = null,
  @subscriber_security_mode = 1,
  @frequency_type = 64,
  @frequency_interval = 1,
  @frequency_relative_interval = 1,
  @frequency_recurrence_factor = 0,
  @frequency_subday = 4,
  @frequency_subday_interval = 5,
  @active_start_time_of_day = 0,
  @active_end_time_of_day = 235959,
  @active_start_date = 0,
  @active_end_date = 0,
  @dts_package_location = N'Distributor';

Tôi sao chép đầu ra và thực thi tập lệnh tại phiên bản của nhà xuất bản để thiết lập đăng ký.

Tôi nghĩ rằng tôi không thể tự động hóa điều này trong T-SQL thuần túy mà không chỉnh sửa tập lệnh trước khi chạy nó, bởi vì T-SQL theo thiết kế không xử lý đầu vào của người dùng.

Sử dụng PowerShell và RMO

PowerShell có những cách đơn giản để xử lý dữ liệu nhập của người dùng, vì vậy đây có vẻ là một cách tốt để tạo nguyên mẫu cho quy trình tự động hóa.

MSDN có một hướng dẫn tám bước để thiết lập đăng ký đẩy bằng cách sử dụng Đối tượng quản lý nhân rộng .NET (RMO).

Đây là hai bước đầu tiên:

  1. Tạo kết nối với Nhà xuất bản bằng cách sử dụng lớp ServerConnection .
  2. Tạo một thể hiện của lớp TransPublication bằng cách sử dụng kết nối Publisher từ bước 1. Chỉ định Tên , DatabaseNameConnectionContext .

Tôi đang cố gắng dịch các bước này thành tập lệnh PowerShell, nhưng tôi không thể vượt qua bước 2.

Trong các ví dụ mã sau, tôi sử dụng tên đối tượng hư cấu. Tôi tin rằng điều này không ảnh hưởng đến khả năng trả lời của câu hỏi vì thông báo lỗi giống hệt nhau khi tôi sử dụng tên đối tượng thực.

Nỗ lực đầu tiên: thiết lập các thuộc tính

Nỗ lực đầu tiên của tôi là tạo đối tượng TransReplication sau đó đặt thuộc tính của nó. Mã trông như thế này:

Add-Type -AssemblyName "Microsoft.SqlServer.Rmo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

$Publisher = New-Object Microsoft.SqlServer.Management.Common.ServerConnection MyServer

$Publication = New-Object Microsoft.SqlServer.Replication.TransPublication
$Publication.Name = 'MyPublication'
$Publication.DatabaseName = 'MyDatabase'
$Publication.ConnectionContext = $Publisher

Khi tôi thực thi tập lệnh này, tôi thấy lỗi sau:

Exception setting "ConnectionContext": "Cannot convert the "server='(local)';Trusted_Connection=true;multipleactiveresultsets=false" value
 of type "Microsoft.SqlServer.Management.Common.ServerConnection" to type "Microsoft.SqlServer.Management.Common.ServerConnection"."
At line:8 char:14
+ $Publication. <<<< ConnectionContext = $Publisher
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

Có vẻ như nó không thành công vì nó không thể chuyển đổi loại ServerConnectionthành loại ServerConnection. Tôi không hiểu làm thế nào điều này có thể thất bại vì lý do đã nêu, vì giá trị đã thuộc loại bắt buộc.

Nỗ lực thứ hai: làm quá tải hàm tạo

Nỗ lực thứ hai của tôi là chỉ định các giá trị thuộc tính của đối tượng TransReplication trong hàm tạo. Mã trông như thế này:

Add-Type -AssemblyName "Microsoft.SqlServer.Rmo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

$Publisher = New-Object Microsoft.SqlServer.Management.Common.ServerConnection MyServer

$Publication = New-Object Microsoft.SqlServer.Replication.TransPublication 'MyPublication', 'MyDatabase', $Publisher

Khi tôi thực thi tập lệnh này, tôi thấy lỗi sau:

New-Object : Cannot find an overload for "TransPublication" and the argument count: "3".
At line:5 char:26
+ $Publication = New-Object <<<<  -TypeName Microsoft.SqlServer.Replication.TransPublication 'MyPublication', 'MyDatabase', $Publisher
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

Dường như lệnh ghép ngắn đối tượng mới không thể tìm thấy hàm tạo ba đối số được ghi lại bởi MSDN:

public TransPublication(
  string name,
  string databaseName,
  ServerConnection connectionContext
)

Thông số

  • Tên
    Loại: System.String
    Một giá trị Chuỗi xác định tên của ấn phẩm.
  • cơ sở dữ liệu
    Loại: System.String
    Một giá trị Chuỗi xác định tên của cơ sở dữ liệu xuất bản.
  • ConnectionContext
    Loại: Microsoft.SqlServer.Man Quản lý.Common.ServerConnection
    Một đối tượng ServerConnection đại diện cho một kết nối đến Nhà xuất bản hoặc Nhà phân phối cho Nhà xuất bản Máy chủ không phải là SQL.

Theo như tôi có thể nói, tôi đang làm quá tải hàm tạo một cách chính xác.

Tôi có làm điều gì sai? Có điều gì đó bất thường về môi trường của tôi? Tôi có tốt hơn khi sử dụng một giải pháp khác?

Câu trả lời:


2

Tôi sẽ phác thảo một cách T-SQL sử dụng hầu hết những gì bạn đã có.

  1. Tạo một bảng để chứa thông tin xuất bản của bạn (đối với giải pháp mà tôi đã viết, đó chỉ là tên của ấn phẩm và một cột định danh)
  2. Tạo một bảng để chứa thông tin thuê bao của bạn (trong tôi, tôi có tên của người đăng ký, cơ sở dữ liệu thuê bao, cột nhận dạng và một cột tham chiếu lại ấn phẩm)
  3. Khi bạn muốn tạo một thuê bao mới, bạn đặt một hàng mới trong bảng thuê bao với các thông tin liên quan
  4. Trong tập lệnh "thêm đăng ký" của bạn, hãy thực hiện nối trái giữa bảng và syssub mô tả của bạn để tìm hiểu những đăng ký nào trong bảng của bạn nhưng chưa tồn tại. Chạy một con trỏ qua thông tin đó và cho mỗi thuê bao không tồn tại, hãy tạo nó.
  5. Sau khi bạn hoàn tất việc thêm tất cả các đăng ký, hãy gọi sp_startpublication_snapshot cho mỗi ấn phẩm có các thuê bao chưa được khởi tạo.
  6. Vây (hay còn gọi là "bạn đã hoàn thành").

Các đối tượng hỗ trợ có tồn tại trong cơ sở dữ liệu của nhà xuất bản hoặc cơ sở dữ liệu thuê bao không? Làm thế nào để người đăng ký biết nơi tìm nhà xuất bản? Có vẻ như giải pháp của bạn được thúc đẩy bởi nhà xuất bản. Tôi đang tìm kiếm một quy trình được thúc đẩy bởi người đăng ký, để tôi có thể thiết lập các trường hợp đăng ký theo yêu cầu.
Iain Samuel McLean Elder

Tất cả các đối tượng sống tại nhà xuất bản, nhưng nếu bạn đang thiết lập đăng ký đẩy, tất cả các lệnh đều được chạy ở đó. Nhưng ngay cả khi chúng được đăng ký kéo, vẫn phải có một số lệnh chạy tại nhà xuất bản. Và vì người đăng ký có thể là phù du nhưng nhà xuất bản (về lý thuyết) là vĩnh viễn, nên tôi có thể lưu trữ tất cả các thông tin liên quan tại nhà xuất bản.
Ben Thul

Tất cả mọi thứ bạn nói về việc lưu trữ các đối tượng và chạy các lệnh tại nhà xuất bản đều có ý nghĩa. Trong bất kỳ triển khai nào, tôi muốn máy chủ của thuê bao kiểm soát quá trình thiết lập sao chép. Nếu điều đó có nghĩa là thực hiện một kết nối từ xa để gọi các thủ tục được lưu trữ sao chép tại nhà xuất bản te, thì hãy là nó. Trình tự các bước để thiết lập phiên bản hoàn chỉnh với đăng ký có thể dài và đa dạng (cài đặt SQL Server, định cấu hình cài đặt máy chủ toàn cầu, tạo lược đồ cơ sở dữ liệu người dùng, đăng nhập liên kết với tài khoản Windows, chèn dữ liệu tĩnh, thiết lập ấn phẩm và subscrptions).
Iain Samuel McLean Elder

Một câu hỏi mà tôi cảm thấy tôi cần phải hỏi: tại sao bạn lại để bất cứ ai đăng ký vào ấn phẩm của bạn? Hãy xem những quyền nào được yêu cầu để chạy các thủ tục lưu trữ sao chép khác nhau. Bạn biết môi trường của mình tốt nhất, nhưng có vẻ như bạn đang gặp rắc rối ở một số điểm.
Ben Thul

Chỉ các nhà quản trị mới được phép đăng ký ấn phẩm như là một phần của việc triển khai tất cả các thành phần cho ví dụ. Chúng tôi đang thử nghiệm với các phiên bản lớp hiển thị theo yêu cầu, vì vậy chúng tôi muốn một quy trình một bước. Hiện tại, phải mất phần tốt nhất trong một ngày để triển khai tất cả các thành phần cho một ví dụ.
Iain Samuel McLean Elder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.