Compartilhar via


DROP CONNECTION (catálogo estrangeiro)

Aplica-se a:marcado como sim Databricks SQL marcado como sim Databricks Runtime 17.3 e acima

Importante

Esse recurso está em Visualização Pública e só está disponível para clientes participantes no momento. Para participar da versão prévia, inscreva-se preenchendo este formulário. Esse recurso só dá suporte à desconexão para catálogos externos usando Hive Metastore (HMS) e Glue Federation.

Use o DROP CONNECTION comando para converter um catálogo estrangeiro em um catálogo padrão no Catálogo do Unity. Depois de remover a conexão, o catálogo não sincroniza mais tabelas estrangeiras do catálogo externo. Em vez disso, ele atua como um catálogo padrão do Unity Catalog que contém tabelas gerenciadas ou externas. Seu catálogo agora é marcado como padrão, em vez de como estrangeiro, no Catálogo do Unity. Esse comando não afeta tabelas em seu catálogo externo; isso afeta apenas o catálogo estrangeiro no Catálogo do Unity.

Requer permissões de OWNER ou de MANAGE, USE_CATALOG e BROWSE no catálogo.

Sintaxe

ALTER CATALOG catalog_name DROP CONNECTION { RESTRICT | FORCE }

Parâmetros

  • catalog_name

    O nome do catálogo estrangeiro para converter em um catálogo padrão.

  • RESTRINGIR

    Comportamento padrão. DROP CONNECTION com RESTRICT falha ao converter o catálogo estrangeiro em um catálogo padrão se houver tabelas estrangeiras ou exibições estrangeiras no catálogo.

    Para atualizar tabelas estrangeiras para tabelas gerenciadas ou externas do Catálogo do Unity, consulte Converter uma tabela estrangeira em uma tabela gerenciada do Catálogo do Unity ou converter uma tabela estrangeira em uma tabela externa do Catálogo do Unity. Para converter exibições estrangeiras, consulte SET MANAGED (FOREIGN VIEW).

  • FORÇA

    DROP CONNECTION com FORCE descarta quaisquer tabelas ou exibições estrangeiras restantes em um catálogo estrangeiro ao converter o catálogo estrangeiro em um catálogo padrão. Esse comando não descarta nenhum dado ou metadados em seu catálogo externo; ele só descarta os metadados sincronizados no Catálogo do Unity para criar a tabela estrangeira.

    Aviso

    Não é possível reverter esse comando. Se você quiser federar as tabelas estrangeiras de volta ao Catálogo do Unity, será necessário recriar o catálogo estrangeiro.

Exemplos

-- 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 para verificar tabelas e exibições estrangeiras

Observação

Antes de usar DROP CONNECTION RESTRICT, você pode usar esses scripts python para verificar se há tabelas e exibições estrangeiras em seu catálogo usando a API REST do Catálogo do Unity.

Script para listar todas as tabelas e exibições estrangeiras do catálogo federado:

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 para listar todas as tabelas e exibições estrangeiras que estão no estado de provisionamento ATIVO:

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)