PackageSubscriber
インストールごとに 1 つのレコードが作成されます。たとえば、5 個の組織で 2 個のパッケージがインストールされた場合、10 個のレコードが作成されます。
サポートされているコール
describeSObjects()、query()、retrieve()
特別なアクセスルール
第一世代管理パッケージの転送アップグレードを開始するには、「AppExchange パッケージのアップロード」ユーザー権限が必要です。
ロック解除済み管理パッケージまたは第二世代管理パッケージの転送アップグレードを開始するには、「第二世代パッケージの作成および更新」権限が必要です。
転送アップグレード機能は、AppExchange セキュリティレビューに合格した第一世代および第二世代管理パッケージでのみ使用できます。管理パッケージの転送アップグレードを有効にするには、Salesforce パートナーコミュニティでサポートケースを登録します。
ロック解除済みパッケージでは、転送アップグレードはデフォルトで有効になっています。
項目
| 項目名 | 詳細 |
|---|---|
| InstalledStatus |
|
| InstanceName |
|
| MetadataPackageId |
|
| MetadataPackageVersionId |
|
| OrgKey |
|
| OrgName |
|
| OrgStatus |
|
| OrgType |
|
| ParentOrg |
|
使用方法
次に、実行できる API クエリの種別の例を示します。
| クエリ | 文字列 |
|---|---|
| 特定のパッケージ ID のすべてのパッケージサブスクライバー組織を取得 | SELECT Id, OrgKey, OrgStatus, OrgName, OrgType FROM PackageSubscriber WHERE MetadataPackageVersionId = '04t...' |
| ログインしている組織で作成されたパッケージがインストールされているすべてのパッケージサブスクライバー組織を取得 | SELECT Id, OrgKey, OrgStatus, OrgName, OrgType FROM PackageSubscriber WHERE InstalledStatus = 'i' |
インスタンスでの PackageSubscriber オブジェクトの絞り込み
パッケージに多くのサブスクライバーがいる場合、PackageSubscriber オブジェクトのクエリには時間がかかります。クエリパフォーマンスを向上するために、PackageSubscriber クエリに InstanceName などの検索条件を追加します。InstanceName は、サブスクライバー組織がホストされているインスタンスを表す項目です。
- 組織のパッケージおよびパッケージの最新リリースバージョンを取得します。
1/** 2* Get the MetadataPackage object corresponding to this org's managed package 3*/ 4public MetadataPackage getMetadataPackage() throws ConnectionException { 5 // retrieve the managed package, which won’t have an empty namespace 6 QueryResult result = conn.query("select id from MetadataPackage where namespaceprefix <> ''"); 7 8 return (MetadataPackage) result.getRecords()[0]; 9} 10 11/** 12* Get the latest MetadataPackageVersion object of the given MetadataPackage 13*/ 14public MetadataPackageVersion getLatestMetadataPackageVersion(MetadataPackage metadataPackage) 15throws ConnectionException { 16 // get the latest released version of the given package 17 String query = "Select id, ReleaseState, MajorVersion, MinorVersion, PatchVersion, 18MetadataPackageId" 19 + " From MetadataPackageVersion" 20 + " Where MetadataPackageId = '%s' and ReleaseState = 'Released'" 21 + " Order by majorversion desc, minorversion desc, patchversion desc"; 22 23 QueryResult result = conn.query(String.format(query, metadataPackage.getId())); 24 25 return (MetadataPackageVersion) result.getRecords()[0]; 26} - 対象となるサブスクライバーを取得します。次のクエリ文字列およびメソッドは、インスタンスによって絞り込まれた PackageSubscribers を照会できるように変更されています。
1static final String PACKAGE_SUBSCRIBER_ORG_KEY_QUERY = "Select OrgKey from PackageSubscribers where OrgStatus = 'Active'" 2 + " and InstalledStatus = 'I'" 3 + " and InstanceName = '%s'"; // placeholder for instance values 4 5static final String METADATA_PACKAGE_VERSION_QUERY = "Select Id, Name, ReleaseState, (%s) from MetadataPackageVersion" 6 + " where MetadataPackageId = '%s' AND ReleaseState = 'Released'" 7 + " AND (MajorVersion < %s OR (MajorVersion = %s and MinorVersion < %s)" 8 + " OR (MajorVersion = %s and MinorVersion = %s and PatchVersion < %s))"; 9 10/** 11* Get all PackageSubscribers on the given instance that are eligible to upgrade to the given 12* MetadataPackageVersion 13*/ 14public PackageSubscriber[] getEligibleSubscriberIds(MetadataPackageVersion version, String instanceName) throws ConnectionException { 15 String allPackageId = version.getMetadataPackageId(); 16 Integer major = version.getMajorVersion(); 17 Integer minor = version.getMinorVersion(); 18 Integer patch = version.getPatchVersion(); 19 20 return getEligibleSubscriberIds(major, minor, patch, allPackageId, instanceName); 21}1public PackageSubscriber[] getEligibleSubscriberIds(Integer major, Integer minor, Integer patch, String packageId, String instanceName) throws ConnectionException { 2 String subscriberQuery = String.format(PACKAGE_SUBSCRIBER_ORG_KEY_QUERY, instanceName); 3QueryResult results = conn.query(String.format(METADATA_PACKAGE_VERSION_QUERY, 4subscriberQuery, packageId, major, major, minor, major, minor, patch)); 5 6 return Arrays.stream(results.getRecords()).map(MetadataPackageVersion.class::cast) 7 .filter(mpv -> mpv.getPackageSubscribers() != null) 8 .flatMap(mpv -> Arrays.stream(mpv.getPackageSubscribers().getRecords())) 9 .map(PackageSubscriber.class::cast) 10 .toArray(PackageSubscriber[]::new); 11} - すべてをまとめます。次のコードサンプルは、前のメソッドを使用してワークフローを変更し、インスタンスによってパッケージ転送を実行する方法を示しています。
1String[] instances = { "NA4" }; // Here we list the instances we would like to push to 2MetadataPackage metadataPackage = api.getMetadataPackage(); 3MetadataPackageVersion version = api.getLatestMetadataPackageVersion(metadataPackage); 4 5// do pushes by instance to avoid API timeouts retrieving PackageSubscribers 6for (String instanceName : instances) { 7PackageSubscriber[] eligibleSubscribers = api.getEligibleSubscriberIds(version, 8instanceName); 9 10// ... proceed with creating PushRequests and PushJobs as before