DROP CONNECTION (catalogue étranger)

S’applique à :coché oui Databricks SQL coché oui Databricks Runtime 17.3 et versions ultérieures

Important

Cette fonctionnalité est disponible en préversion publique et est disponible uniquement pour les clients participants pour l’instant. Pour participer à l'aperçu, remplissez ce formulaire. Cette fonctionnalité prend uniquement en charge l'interruption de la connexion pour les catalogues étrangers utilisant le metastore Hive (HMS) et la Glue Federation.

Utilisez la DROP CONNECTION commande pour convertir un catalogue étranger en catalogue standard dans le catalogue Unity. Après avoir supprimé la connexion, le catalogue ne synchronise plus les tables étrangères à partir du catalogue externe. Au lieu de cela, il agit comme un catalogue Unity Catalog standard contenant des tables gérées ou externes. Votre catalogue est désormais étiqueté comme standard au lieu d’être étranger dans le catalogue Unity. Cette commande n’affecte pas les tables de votre catalogue externe ; cela affecte uniquement votre catalogue étranger dans le catalogue Unity.

Nécessite OWNER ou MANAGE, USE_CATALOGet BROWSE autorisations sur le catalogue.

Syntaxe

ALTER CATALOG catalog_name DROP CONNECTION { RESTRICT | FORCE }

Paramètres

  • catalog_name

    Nom du catalogue étranger à convertir en catalogue standard.

  • RESTREINDRE

    Comportement par défaut. DROP CONNECTION avec RESTRICT échoue lors de la conversion du catalogue étranger en catalogue standard s'il y a des tables étrangères ou des vues étrangères dans le catalogue.

    Pour mettre à niveau des tables étrangères vers des tables gérées ou externes du catalogue Unity, consultez Convertir une table étrangère en table de catalogue Unity managée ou Convertir une table étrangère en table de catalogue Unity externe. Pour convertir des vues étrangères, consultez SET MANAGED (FOREIGN VIEW).

  • FORCE

    DROP CONNECTION avec FORCE supprime les tables ou vues étrangères restantes dans un catalogue étranger lors de la conversion du catalogue étranger en un catalogue standard. Cette commande ne supprime aucune donnée ni métadonnées dans votre catalogue externe ; elle supprime uniquement les métadonnées synchronisées dans le catalogue Unity pour créer la table étrangère.

    Avertissement

    Vous ne pouvez pas restaurer cette commande. Si vous souhaitez fédérer les tables étrangères dans le catalogue Unity, vous devez recréer le catalogue étranger.

Examples

-- Convert an existing foreign catalog using default RESTRICT behavior
> ALTER CATALOG hms_federated_catalog DROP CONNECTION;
OK

-- Convert an existing foreign catalog using FORCE to drop foreign tables
> ALTER CATALOG hms_federated_catalog DROP CONNECTION FORCE;
OK

-- RESTRICT fails if foreign tables or views exist
> ALTER CATALOG hms_federated_catalog DROP CONNECTION RESTRICT;
[CATALOG_CONVERSION_FOREIGN_ENTITY_PRESENT] Catalog conversion from UC Foreign to UC Standard failed because catalog contains foreign entities (up to 10 are shown here): <entityNames>. To see the full list of foreign entities in this catalog, please refer to the scripts below.

-- FORCE fails if catalog type isn't supported
> ALTER CATALOG redshift_federated_catalog DROP CONNECTION FORCE;
[CATALOG_CONVERSION_UNSUPPORTED_CATALOG_TYPE] Catalog cannot be converted from UC Foreign to UC Standard. Only HMS and Glue Foreign UC catalogs can be converted to UC Standard.

Scripts pour la vérification des tables et vues externes

Note

Avant d’utiliser DROP CONNECTION RESTRICT, vous pouvez utiliser ces scripts Python pour rechercher des tables et des vues étrangères dans votre catalogue à l’aide de l’API REST du catalogue Unity.

Script pour répertorier toutes les tables et vues étrangères à partir du catalogue fédéré :

import requests

def list_foreign_uc_tables_and_views(catalog_name, pat_token, workspace_url):
    """
    Lists all foreign tables and views in the specified Unity Catalog.

    Args:
        catalog_name (str): The name of the catalog to search.
        pat_token (str): Personal Access Token for Databricks API authentication.
        workspace_url (str): Databricks workspace hostname (e.g., "https://adb-xxxx.x.azuredatabricks.net").

    Returns:
        list: A list of dictionaries containing information about the foreign tables/views.
    """
    base_url = f"{workspace_url}/api/2.1/unity-catalog"
    headers = {
        "Authorization": f"Bearer {pat_token}",
        "Content-Type": "application/json"
    }

    # Step 1: List all schemas in the catalog (GET request)
    schemas_url = f"{base_url}/schemas"
    schemas_params = {
        "catalog_name": catalog_name,
        "include_browse": "true"
    }

    schemas_resp = requests.get(schemas_url, headers=headers, params=schemas_params)
    schemas_resp.raise_for_status()
    schemas = schemas_resp.json().get("schemas", [])
    schema_names = [schema["name"] for schema in schemas]

    result = []

    # Step 2: For each schema, list all tables/views and filter (GET request)
    for schema_name in schema_names:
        tables_url = f"{base_url}/table-summaries"
        tables_params = {
            "catalog_name": catalog_name,
            "schema_name_pattern": schema_name,
            "include_manifest_capabilities": "true"
        }

        tables_resp = requests.get(tables_url, headers=headers, params=tables_params)
        tables_resp.raise_for_status()
        tables = tables_resp.json().get("tables", [])

        for table in tables:
            # Use OR for filtering as specified
            if (
                table.get("table_type") == "FOREIGN"
                or table.get("securable_kind") in {
                    "TABLE_FOREIGN_HIVE_METASTORE_VIEW",
                    "TABLE_FOREIGN_HIVE_METASTORE_DBFS_VIEW"
                }
            ):
                result.append(table.get("full_name"))

    return result

# Example usage:
# catalog = "hms_foreign_catalog"
# token = "dapiXXXXXXXXXX"
# workspace = "https://adb-xxxx.x.azuredatabricks.net"
# foreign_tables = list_foreign_uc_tables_and_views(catalog, token, workspace)
# for entry in foreign_tables:
#     print(entry)

Script pour répertorier toutes les tables et vues étrangères qui sont dans l’état d’approvisionnement ACTIVE :

import requests

def list_foreign_uc_tables_and_views(catalog_name, pat_token, workspace_url):
    """
    Lists all foreign tables and views in the specified Unity Catalog.

    Args:
        catalog_name (str): The name of the catalog to search.
        pat_token (str): Personal Access Token for Databricks API authentication.
        workspace_url (str): Databricks workspace hostname (e.g., "https://adb-xxxx.x.azuredatabricks.net").

    Returns:
        list: A list of dictionaries containing information about the foreign tables/views.
    """
    base_url = f"{workspace_url}/api/2.1/unity-catalog"
    headers = {
        "Authorization": f"Bearer {pat_token}",
        "Content-Type": "application/json"
    }

    # Step 1: List all schemas in the catalog (GET request)
    schemas_url = f"{base_url}/schemas"
    schemas_params = {
        "catalog_name": catalog_name,
        "include_browse": "true"
    }

    schemas_resp = requests.get(schemas_url, headers=headers, params=schemas_params)
    schemas_resp.raise_for_status()
    schemas = schemas_resp.json().get("schemas", [])
    schema_names = [schema["name"] for schema in schemas]

    result = []

    # Step 2: For each schema, list all tables/views and filter (GET request)
    for schema_name in schema_names:
        tables_url = f"{base_url}/table-summaries"
        tables_params = {
            "catalog_name": catalog_name,
            "schema_name_pattern": schema_name,
            "include_manifest_capabilities": "true"
        }

        tables_resp = requests.get(tables_url, headers=headers, params=tables_params)
        tables_resp.raise_for_status()
        tables = tables_resp.json().get("tables", [])

        for table in tables:
            # Use OR for filtering as specified
            if (
                table.get("table_type") == "FOREIGN"
                or table.get("securable_kind") in {
                    "TABLE_FOREIGN_HIVE_METASTORE_VIEW",
                    "TABLE_FOREIGN_HIVE_METASTORE_DBFS_VIEW"
                }
            ):
                table_full_name = table.get('full_name')
                get_table_url = f"{base_url}/tables/{table_full_name}"
                tables_params = {
                    "full_name": table_full_name,
                    "include_browse": "true",
                    "include_manifest_capabilities": "true"
                }

                table_resp = requests.get(get_table_url, headers=headers, params=tables_params)
                table_resp.raise_for_status()
                provisioning_info = table_resp.json().get("provisioning_info", dict()).get("state", "")

                if provisioning_info == "ACTIVE":
                    result.append(table_full_name)

    return result

# Example usage:
# catalog = "hms_foreign_catalog"
# token = "dapiXXXXXXXXXX"
# workspace = "https://adb-xxxx.x.azuredatabricks.net"
# foreign_tables = list_foreign_uc_tables_and_views(catalog, token, workspace)
# for entry in foreign_tables:
#     print(entry)