SQL Server の R パッケージの同期
適用対象: SQL Server 2017 (14.x) のみ
SQL Server 2017 に含まれるバージョンの RevoScaleR には、パッケージが使用されるインスタンスやデータベースとファイル システムの間で R パッケージのコレクションを同期する機能が含まれています。
この機能は、SQL Server データベースに関連付けられている R パッケージ コレクションを容易にバックアップするために用意されています。 この機能を使用すると、管理者はデータベースだけでなく、そのデータベースで作業するデータ サイエンティストが使用していた R パッケージも復元できます。
この記事では、パッケージの同期機能について説明すると共に、rxSyncPackages 関数を使用して、以下のタスクを実行する方法について説明します。
SQL Server データベース全体について、パッケージの一覧を同期します
個々のユーザーまたはユーザー グループが使用するパッケージを同期します
ユーザーが別の SQL Server に移動した場合は、そのユーザーの作業データベースのバックアップを作成し、新しいサーバーに復元することができます。このユーザーのパッケージは、R での必要性に応じて、新しいサーバーのファイル システムにインストールされます。
たとえば、次のようなシナリオでパッケージの同期を使用できます。
DBA が SQL Server のインスタンスを新しいマシンに復元し、ユーザーに対して、R クライアントから接続して
rxSyncPackages
を実行し、パッケージの更新と復元を行うように求めている。ファイル システム上の R パッケージが破損していると思われるため、SQL Server で
rxSyncPackages
を実行する。
必要条件
パッケージの同期を使用するには、適切なバージョンの Microsoft R を事前に用意しておく必要があります。この機能は、Microsoft R バージョン 9.1.0 以降で提供されています。
また、サーバーでパッケージ管理機能を有効にする必要もあります。
使用しているサーバーでパッケージ管理がサポートされているかどうかを判断する
この機能は、SQL Server 2017 CTP 2 以降で使用できます。
パッケージ管理機能を有効にする
パッケージの同期を使用するには、SQL Server インスタンスと個々のデータベースで、新しいパッケージ管理機能が有効になっている必要があります。 詳細については、SQL Server のパッケージ管理の有効化または無効化に関する記事をご覧ください。
- サーバー管理者が、SQL Server インスタンスでこの機能を有効にします。
- 各データベースについては、管理者がデータベース ロールを使用して、個々のユーザーに R パッケージをインストールまたは共有する権限を付与します。
この処理が完了したら、rxInstallPackages などの RevoScaleR 関数を使用して、データベースにパッケージをインストールできます。 ユーザーおよびユーザーが使用できるパッケージに関する情報は、SQL Server インスタンスに格納されます。
パッケージ管理機能を使用して新しいパッケージを追加するたびに、SQL Server のレコードとファイル システムの両方が更新されます。 この情報は、データベース全体のパッケージ情報を復元する際に使用できます。
アクセス許可
パッケージ同期関数を実行するユーザーは、SQL Server インスタンスと、パッケージが含まれているデータベースのセキュリティ プリンシパルである必要があります。
関数の呼び出し元は、パッケージ管理ロールの rpkgs-shared または rpkgs-private のメンバーである必要があります。
共有とマークされたパッケージを同期するには、その関数を実行しているユーザーが rpkgs-shared ロールのメンバーシップを持っている必要があります。また、移動されるパッケージは共有スコープ ライブラリにインストールされている必要があります。
プライベートとマークされたパッケージを同期するには、パッケージの所有者または管理者が関数を実行する必要があります。また、パッケージはプライベートである必要があります。
他のユーザーの代わりにパッケージを同期するには、所有者が db_owner データベース ロールのメンバーである必要があります。
パッケージの同期のしくみ
パッケージの同期を使用するには、rxSyncPackagesを呼び出します。これは RevoScaleR の新しい関数です。
rxSyncPackages
を呼び出すたびに、SQL Server インスタンスとデータベースを指定する必要があります。 次に、同期するパッケージの一覧またはパッケージのスコープを指定します。
RxInSqlServer
関数を使用して、SQL Server のコンピューティング コンテキストを作成します。 コンピューティング コンテキストを指定しない場合は、現在のコンピューティング コンテキストが使用されます。指定されたコンピューティング コンテキストで、インスタンス上のデータベースの名前を指定します。 パッケージはデータベースごとに同期されます。
スコープ引数を使用して、同期するパッケージを指定します。
プライベート スコープを使用する場合は、指定された所有者が所有するパッケージのみが同期されます。 共有スコープを指定した場合、データベース内のすべての非プライベート パッケージが同期されます。
プライベートまたは共有スコープのいずれも指定せずに関数を実行すると、すべてのパッケージが同期されます。
コマンドが正常に実行された場合は、指定されたスコープと所有者を使用して、ファイル システム内の既存のパッケージがデータベースに追加されます。
ファイル システムが破損している場合は、データベースに保持されている一覧に基づいてパッケージが復元されます。
ターゲット データベースでパッケージ管理機能を使用できない場合は、"パッケージ管理機能が SQL Server で有効になっていないか、バージョンが古すぎます" というエラーが発生します。
例 1. すべてのパッケージをデータベースごとに同期する
この例では、ローカル ファイル システムから新しいパッケージを取得し、データベース TestDB にパッケージをインストールします。 所有者が指定されていないため、一覧には、インストールされているすべてのパッケージ (プライベート スコープと共有スコープ) が含まれます。
connectionString <- "Driver=SQL Server;Server=myServer;Database=TestDB;Trusted_Connection=True;"
computeContext <- RxInSqlServer(connectionString = connectionString )
rxSyncPackages(computeContext=computeContext, verbose=TRUE)
例 2. 同期されるパッケージをスコープで制限する
次の例では、指定したスコープ内のパッケージのみを同期します。
#Shared scope
rxSyncPackages(computeContext=computeContext, scope="shared", verbose=TRUE)
#Private scope
rxSyncPackages(computeContext=computeContext, scope="private", verbose=TRUE)
例 3. 同期されるパッケージを所有者で制限する
次の例は、特定のユーザーに対してインストールされたパッケージのみを同期する方法を示しています。 この例では、ユーザーは SQL ログイン名 user1 によって識別されます。
rxSyncPackages(computeContext=computeContext, scope="private", owner = "user1", verbose=TRUE))