microsoft / microsoft/sqlmanagementobjects

[Feature] Copy objects from live Server to offline (design mode) Server

オープン
#205 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
C#
スター
143
フォーク
28
PR マージ指標
30日以内にマージされた PR はありません

説明

It would be really great if there were a way to transfer object definitions from a live server to an offline server.
My use case is that I am designing an application which allows users to compile many database objects from different instances into a single hierarchy, then generate a script to create that hierarchy on an arbitrary instance of SQL Server.
To accomplish this, I was hoping to add the online objects selected by the user to an offline (design mode) Server, then use SMO's scripting capabilities to script the entire tree to a .sql file.

For example:

var onlineServerConnection = new ServerConnection(new SqlConnection(/* ... */));
var onlineServer = new Server(onlineServerConnection);
var onlineDatabase = onlineServer.Databases["SmoTestDatabaseOnline"];
var onlineTable = onlineDatabase.Tables["SmoTestTable"];

var offlineServerConnection = new ServerConnection { ServerVersion = new ServerVersion(15, 0), TrueName = "designMode" };
var offlineServer = new Server(offlineServerConnection);
(offlineServer as ISfcHasConnection).ConnectionContext.Mode = SfcConnectionContextMode.Offline;
var offlineDatabase = new Database
{
	Parent = offlineServer,
	Name = "SmoTestDatabaseOffline"
};
onlineTable.Parent = offlineDatabase;
offlineDatabase.Tables.Add(onlineTable);
offlineServer.Databases.Add(offlineDatabase);

But I'm met with Microsoft.SqlServer.Management.Smo.FailedOperationException: SetParent failed for Table 'dbo.SmoTestTable'. ---> Microsoft.SqlServer.Management.Smo.InvalidSmoOperationException: Cannot perform the operation on this object, because the object is a member of a collection..
If I remove the onlineTable.Parent = offlineDatabase;, I am instead met with Microsoft.SqlServer.Management.Smo.FailedOperationException: Parent property of object [dbo].[SmoTestTable] does not match the collection's parent to which it is added.

I also attempted to use the Transfer class to accomplish this, but was met with Microsoft.SqlServer.Management.Common.TransferException: An error occurred while transferring data. See the inner exception for details. ---> Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

var onlineDatabase = onlineServer.Databases["SmoTestDatabaseOnline"];
var onlineTable = onlineDatabase.Tables["SmoTestTable"];

//--------------------------------------------------

var transfer = new Transfer(onlineDatabase)
{
	DestinationServer = offlineServer.Name,
	DestinationDatabase = offlineDatabase.Name,
	CopyAllObjects = false,
	CopySchema = true
};
transfer.ObjectList.Add(onlineTable);
transfer.TransferData();

offlineServer.Refresh();
offlineDatabase.Refresh();

As it stands, the only conceivable way to accomplish what I want to do would be to create a new Table object and individually copy all properties onlineTable to it. But this is cumbersome and prone to error.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

issue に示されている Server、Database、Table、Transfer のエントリポイントから始め、オフラインのデザインモードにおける parenting と transfer の動作に焦点を当てます。ライブサーバーからオフラインサーバーへオブジェクト定義をコピーし、宛先インスタンスに接続せずに結果として得られる階層をスクリプト化する、サポートされた方法を特定してください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
csharp
領域
database
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
30/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。