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:
- Tạo kết nối với Nhà xuất bản bằng cách sử dụng lớp ServerConnection .
- 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 , DatabaseName và ConnectionContext .
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 ServerConnection
thà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?