{"id":2417,"date":"2026-01-26T12:22:18","date_gmt":"2026-01-26T11:22:18","guid":{"rendered":"https:\/\/bicontrolling.com\/?p=2417"},"modified":"2026-02-13T14:24:08","modified_gmt":"2026-02-13T13:24:08","slug":"centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric","status":"publish","type":"post","link":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/","title":{"rendered":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<p>En entornos reales de <strong>Microsoft Fabric<\/strong> no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples <strong>workspaces<\/strong>, <strong>lakehouses<\/strong>, <strong>warehouses<\/strong> y <strong>bases de datos SQL<\/strong>, que van creciendo con el tiempo y se reutilizan desde distintos notebooks.<\/p>\n\n\n\n<p>El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una forma ordenada de acceder a los artefactos. Muy r\u00e1pidamente los notebooks empiezan a llenarse de:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>rutas <code>abfss:\/\/...<\/code> hardcodeadas<\/li>\n\n\n\n<li>IDs de workspaces y lakehouses copiados a mano<\/li>\n\n\n\n<li>dependencias impl\u00edcitas que solo entiende quien escribi\u00f3 el c\u00f3digo<\/li>\n<\/ul>\n\n\n\n<p>Todo funciona\u2026 hasta que el mantenimiento y la evoluci\u00f3n del entorno se vuelven una pesadilla.<\/p>\n\n\n\n<p>Este art\u00edculo muestra c\u00f3mo <strong>centralizar el acceso a los artefactos de Microsoft Fabric desde un \u00fanico notebook<\/strong>, utilizando la API de Fabric para descubrir din\u00e1micamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>los workspaces disponibles,<\/li>\n\n\n\n<li>sus lakehouses,<\/li>\n\n\n\n<li>warehouses<\/li>\n\n\n\n<li>y bases de datos SQL<\/li>\n<\/ul>\n\n\n\n<p>y exponer esa informaci\u00f3n como <strong>variables globales reutilizables<\/strong> y como un <strong>cat\u00e1logo en memoria<\/strong> accesible desde otros notebooks.<\/p>\n\n\n\n<p>El objetivo no es gestionar permisos ni seguridad, ni abstraer Fabric detr\u00e1s de una capa compleja. El objetivo es mucho m\u00e1s pr\u00e1ctico:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Dejar de repetir rutas, IDs y nombres en cada notebook y disponer de un \u00fanico punto de referencia para acceder a los artefactos de Fabric.<\/p>\n<\/blockquote>\n\n\n\n<p>A lo largo del art\u00edculo construiremos este notebook <strong>paso a paso<\/strong>, empezando por una versi\u00f3n b\u00e1sica y evolucion\u00e1ndolo hasta una soluci\u00f3n robusta que tenga en cuenta las <strong>limitaciones reales de la API de Microsoft Fabric.<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Descubriendo artefactos de Microsoft Fabric desde un notebook<\/h2>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>Como primer paso, vamos a construir un c\u00f3digo b\u00e1sico que realiza lo siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Se autentica contra la API<\/strong> de Microsoft Fabric usando el contexto del propio notebook.<\/li>\n\n\n\n<li><strong>Recupera la lista de workspaces<\/strong> visibles para el usuario.<\/li>\n\n\n\n<li>Para cada workspace:\n<ul class=\"wp-block-list\">\n<li>Recupera los <strong>lakehouses<\/strong><\/li>\n\n\n\n<li>Recupera los <strong>warehouses<\/strong><\/li>\n\n\n\n<li>Recupera las <strong>bases de datos SQL<\/strong><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Expone la informaci\u00f3n como variables globales<\/strong> (IDs y rutas principales).<\/li>\n\n\n\n<li>Construye un <strong>diccionario en memoria<\/strong> con todos los artefactos descubiertos.<\/li>\n<\/ol>\n\n\n\n<p>Con esto ya conseguimos algo muy \u00fatil: tener disponibles, desde cualquier notebook, los <strong>IDs y paths de OneLake<\/strong> sin necesidad de hardcodearlos cada vez que necesitemos acceder a alg\u00fan artefacto.<\/p>\n\n\n\n<p>El codigo es el siguiente:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import requests\n\nprint(\"Fabric - Descubrimiento de artefactos\")\n\n# Autenticaci\u00f3n contra la API de Fabric usando el contexto del notebook\ntoken = mssparkutils.credentials.getToken(\"pbi\")\n\nheaders = {\n    \"Authorization\": f\"Bearer {token}\",\n    \"Content-Type\": \"application\/json\"\n}\n\n# Recuperar la lista de workspaces visibles\nprint(\"Recuperando workspaces\")\n\nworkspaces_url = \"https:\/\/api.fabric.microsoft.com\/v1\/workspaces\"\nresponse = requests.get(workspaces_url, headers=headers)\n\nif response.status_code != 200:\n    raise Exception(\n        f\"Error al recuperar workspaces: {response.status_code} - {response.text}\"\n    )\n\nworkspaces = response.json().get(\"value\", [])\n\n# Cat\u00e1logo central en memoria\nFABRIC_CATALOG = {\n    \"lakehouses\": {},\n    \"warehouses\": {},\n    \"sqldatabases\": {},\n    \"metadata\": {\n        \"total_workspaces\": len(workspaces)\n    }\n}\n\ntotal_lakehouses = 0\ntotal_warehouses = 0\ntotal_sqldatabases = 0\n\n# Procesar cada workspace\nfor ws in workspaces:\n    workspace_name = ws&#91;\"displayName\"&#93;\n    workspace_id = ws&#91;\"id\"&#93;\n\n    # Lakehouses del workspace\n    lakehouses_url = (\n        f\"https:\/\/api.fabric.microsoft.com\/v1\/workspaces\/{workspace_id}\/lakehouses\"\n    )\n    lh_response = requests.get(lakehouses_url, headers=headers)\n\n    if lh_response.status_code == 200:\n        lakehouses = lh_response.json().get(\"value\", [])\n\n        for lh in lakehouses:\n            name = lh&#91;\"displayName\"&#93;\n            id_ = lh&#91;\"id\"&#93;\n\n            var_name = ''.join(\n                c for c in name.replace(\" \", \"_\").replace(\"-\", \"_\")\n                if c.isalnum() or c == \"_\"\n            ).upper()\n\n            tables_path = (\n                f\"abfss:\/\/{workspace_id}\"\n                f\"@onelake.dfs.fabric.microsoft.com\/{id_}\/Tables\"\n            )\n\n            files_path = (\n                f\"abfss:\/\/{workspace_id}\"\n                f\"@onelake.dfs.fabric.microsoft.com\/{id_}\/Files\"\n            )\n\n            globals()&#91;f\"{var_name}_WORKSPACE_ID\"&#93; = workspace_id\n            globals()&#91;f\"{var_name}_LAKEHOUSE_ID\"&#93; = id_\n            globals()&#91;f\"{var_name}_PATH\"&#93; = tables_path\n            globals()&#91;f\"{var_name}_FILES_PATH\"&#93; = files_path\n\n            FABRIC_CATALOG&#91;\"lakehouses\"&#93;&#91;var_name&#93; = {\n                \"workspace_name\": workspace_name,\n                \"workspace_id\": workspace_id,\n                \"lakehouse_name\": name,\n                \"lakehouse_id\": id_,\n                \"tables_path\": tables_path,\n                \"files_path\": files_path\n            }\n\n            total_lakehouses += 1\n\n    # Warehouses del workspace\n    warehouses_url = (\n        f\"https:\/\/api.fabric.microsoft.com\/v1\/workspaces\/{workspace_id}\/warehouses\"\n    )\n    wh_response = requests.get(warehouses_url, headers=headers)\n\n    if wh_response.status_code == 200:\n        warehouses = wh_response.json().get(\"value\", [])\n\n        for wh in warehouses:\n            name = wh&#91;\"displayName\"&#93;\n            id_ = wh&#91;\"id\"&#93;\n\n            var_name = ''.join(\n                c for c in name.replace(\" \", \"_\").replace(\"-\", \"_\")\n                if c.isalnum() or c == \"_\"\n            ).upper()\n\n            globals()&#91;f\"{var_name}_WORKSPACE_ID\"&#93; = workspace_id\n            globals()&#91;f\"{var_name}_WAREHOUSE_ID\"&#93; = id_\n\n            FABRIC_CATALOG&#91;\"warehouses\"&#93;&#91;var_name&#93; = {\n                \"workspace_name\": workspace_name,\n                \"workspace_id\": workspace_id,\n                \"warehouse_name\": name,\n                \"warehouse_id\": id_\n            }\n\n            total_warehouses += 1\n\n    # Bases de datos SQL del workspace\n    sqldb_url = (\n        f\"https:\/\/api.fabric.microsoft.com\/v1\/workspaces\/{workspace_id}\/sqldatabases\"\n    )\n    db_response = requests.get(sqldb_url, headers=headers)\n\n    if db_response.status_code == 200:\n        databases = db_response.json().get(\"value\", [])\n\n        for db in databases:\n            name = db&#91;\"displayName\"&#93;\n            id_ = db&#91;\"id\"&#93;\n\n            var_name = ''.join(\n                c for c in name.replace(\" \", \"_\").replace(\"-\", \"_\")\n                if c.isalnum() or c == \"_\"\n            ).upper()\n\n            globals()&#91;f\"{var_name}_WORKSPACE_ID\"&#93; = workspace_id\n            globals()&#91;f\"{var_name}_SQLDB_ID\"&#93; = id_\n\n            FABRIC_CATALOG&#91;\"sqldatabases\"&#93;&#91;var_name&#93; = {\n                \"workspace_name\": workspace_name,\n                \"workspace_id\": workspace_id,\n                \"database_name\": name,\n                \"database_id\": id_\n            }\n\n            total_sqldatabases += 1\n\n# Resumen final\nprint(\"Resumen de artefactos descubiertos\")\nprint(f\"Workspaces: {len(workspaces)}\")\nprint(f\"Lakehouses: {total_lakehouses}\")\nprint(f\"Warehouses: {total_warehouses}\")\nprint(f\"Bases de datos SQL: {total_sqldatabases}\")\nprint(\"Carga finalizada\")\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">import<\/span><span style=\"color: #E1E4E8\"> requests<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">&quot;Fabric - Descubrimiento de artefactos&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Autenticaci\u00f3n contra la API de Fabric usando el contexto del notebook<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">token <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> mssparkutils.credentials.getToken(<\/span><span style=\"color: #9ECBFF\">&quot;pbi&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">headers <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;Authorization&quot;<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Bearer <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">token<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;Content-Type&quot;<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">&quot;application\/json&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Recuperar la lista de workspaces visibles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">&quot;Recuperando workspaces&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">workspaces_url <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&quot;https:\/\/api.fabric.microsoft.com\/v1\/workspaces&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> requests.get(workspaces_url, <\/span><span style=\"color: #FFAB70\">headers<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\">headers)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> response.status_code <\/span><span style=\"color: #F97583\">!=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">200<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">raise<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">Exception<\/span><span style=\"color: #E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Error al recuperar workspaces: <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">response.status_code<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\"> - <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">response.text<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">workspaces <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> response.json().get(<\/span><span style=\"color: #9ECBFF\">&quot;value&quot;<\/span><span style=\"color: #E1E4E8\">, [])<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Cat\u00e1logo central en memoria<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">FABRIC_CATALOG<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;lakehouses&quot;<\/span><span style=\"color: #E1E4E8\">: {},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;warehouses&quot;<\/span><span style=\"color: #E1E4E8\">: {},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;sqldatabases&quot;<\/span><span style=\"color: #E1E4E8\">: {},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;metadata&quot;<\/span><span style=\"color: #E1E4E8\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #9ECBFF\">&quot;total_workspaces&quot;<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">len<\/span><span style=\"color: #E1E4E8\">(workspaces)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">total_lakehouses <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">total_warehouses <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">total_sqldatabases <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Procesar cada workspace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> ws <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> workspaces:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    workspace_name <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> ws&#91;<\/span><span style=\"color: #9ECBFF\">&quot;displayName&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    workspace_id <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> ws&#91;<\/span><span style=\"color: #9ECBFF\">&quot;id&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #6A737D\"># Lakehouses del workspace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    lakehouses_url <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;https:\/\/api.fabric.microsoft.com\/v1\/workspaces\/<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">workspace_id<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">\/lakehouses&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    lh_response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> requests.get(lakehouses_url, <\/span><span style=\"color: #FFAB70\">headers<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\">headers)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> lh_response.status_code <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">200<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        lakehouses <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> lh_response.json().get(<\/span><span style=\"color: #9ECBFF\">&quot;value&quot;<\/span><span style=\"color: #E1E4E8\">, [])<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> lh <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> lakehouses:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            name <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> lh&#91;<\/span><span style=\"color: #9ECBFF\">&quot;displayName&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            id_ <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> lh&#91;<\/span><span style=\"color: #9ECBFF\">&quot;id&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            var_name <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&#39;&#39;<\/span><span style=\"color: #E1E4E8\">.join(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                c <\/span><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> c <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> name.replace(<\/span><span style=\"color: #9ECBFF\">&quot; &quot;<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><span style=\"color: #E1E4E8\">).replace(<\/span><span style=\"color: #9ECBFF\">&quot;-&quot;<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> c.isalnum() <\/span><span style=\"color: #F97583\">or<\/span><span style=\"color: #E1E4E8\"> c <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            ).upper()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            tables_path <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;abfss:\/\/<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">workspace_id<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;@onelake.dfs.fabric.microsoft.com\/<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">id_<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">\/Tables&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            files_path <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;abfss:\/\/<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">workspace_id<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;@onelake.dfs.fabric.microsoft.com\/<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">id_<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">\/Files&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_WORKSPACE_ID&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> workspace_id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_LAKEHOUSE_ID&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> id_<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_PATH&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> tables_path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_FILES_PATH&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> files_path<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">FABRIC_CATALOG<\/span><span style=\"color: #E1E4E8\">&#91;<\/span><span style=\"color: #9ECBFF\">&quot;lakehouses&quot;<\/span><span style=\"color: #E1E4E8\">&#93;&#91;var_name&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;workspace_name&quot;<\/span><span style=\"color: #E1E4E8\">: workspace_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;workspace_id&quot;<\/span><span style=\"color: #E1E4E8\">: workspace_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;lakehouse_name&quot;<\/span><span style=\"color: #E1E4E8\">: name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;lakehouse_id&quot;<\/span><span style=\"color: #E1E4E8\">: id_,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;tables_path&quot;<\/span><span style=\"color: #E1E4E8\">: tables_path,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;files_path&quot;<\/span><span style=\"color: #E1E4E8\">: files_path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            total_lakehouses <\/span><span style=\"color: #F97583\">+=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">1<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #6A737D\"># Warehouses del workspace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    warehouses_url <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;https:\/\/api.fabric.microsoft.com\/v1\/workspaces\/<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">workspace_id<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">\/warehouses&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    wh_response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> requests.get(warehouses_url, <\/span><span style=\"color: #FFAB70\">headers<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\">headers)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> wh_response.status_code <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">200<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        warehouses <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> wh_response.json().get(<\/span><span style=\"color: #9ECBFF\">&quot;value&quot;<\/span><span style=\"color: #E1E4E8\">, [])<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> wh <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> warehouses:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            name <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> wh&#91;<\/span><span style=\"color: #9ECBFF\">&quot;displayName&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            id_ <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> wh&#91;<\/span><span style=\"color: #9ECBFF\">&quot;id&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            var_name <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&#39;&#39;<\/span><span style=\"color: #E1E4E8\">.join(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                c <\/span><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> c <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> name.replace(<\/span><span style=\"color: #9ECBFF\">&quot; &quot;<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><span style=\"color: #E1E4E8\">).replace(<\/span><span style=\"color: #9ECBFF\">&quot;-&quot;<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> c.isalnum() <\/span><span style=\"color: #F97583\">or<\/span><span style=\"color: #E1E4E8\"> c <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            ).upper()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_WORKSPACE_ID&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> workspace_id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_WAREHOUSE_ID&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> id_<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">FABRIC_CATALOG<\/span><span style=\"color: #E1E4E8\">&#91;<\/span><span style=\"color: #9ECBFF\">&quot;warehouses&quot;<\/span><span style=\"color: #E1E4E8\">&#93;&#91;var_name&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;workspace_name&quot;<\/span><span style=\"color: #E1E4E8\">: workspace_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;workspace_id&quot;<\/span><span style=\"color: #E1E4E8\">: workspace_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;warehouse_name&quot;<\/span><span style=\"color: #E1E4E8\">: name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;warehouse_id&quot;<\/span><span style=\"color: #E1E4E8\">: id_<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            total_warehouses <\/span><span style=\"color: #F97583\">+=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">1<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #6A737D\"># Bases de datos SQL del workspace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    sqldb_url <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;https:\/\/api.fabric.microsoft.com\/v1\/workspaces\/<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">workspace_id<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">\/sqldatabases&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    db_response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> requests.get(sqldb_url, <\/span><span style=\"color: #FFAB70\">headers<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\">headers)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> db_response.status_code <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">200<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        databases <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> db_response.json().get(<\/span><span style=\"color: #9ECBFF\">&quot;value&quot;<\/span><span style=\"color: #E1E4E8\">, [])<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> db <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> databases:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            name <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> db&#91;<\/span><span style=\"color: #9ECBFF\">&quot;displayName&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            id_ <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> db&#91;<\/span><span style=\"color: #9ECBFF\">&quot;id&quot;<\/span><span style=\"color: #E1E4E8\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            var_name <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&#39;&#39;<\/span><span style=\"color: #E1E4E8\">.join(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                c <\/span><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> c <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> name.replace(<\/span><span style=\"color: #9ECBFF\">&quot; &quot;<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><span style=\"color: #E1E4E8\">).replace(<\/span><span style=\"color: #9ECBFF\">&quot;-&quot;<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> c.isalnum() <\/span><span style=\"color: #F97583\">or<\/span><span style=\"color: #E1E4E8\"> c <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&quot;_&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            ).upper()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_WORKSPACE_ID&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> workspace_id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">()&#91;<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">var_name<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">_SQLDB_ID&quot;<\/span><span style=\"color: #E1E4E8\">&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> id_<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #79B8FF\">FABRIC_CATALOG<\/span><span style=\"color: #E1E4E8\">&#91;<\/span><span style=\"color: #9ECBFF\">&quot;sqldatabases&quot;<\/span><span style=\"color: #E1E4E8\">&#93;&#91;var_name&#93; <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;workspace_name&quot;<\/span><span style=\"color: #E1E4E8\">: workspace_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;workspace_id&quot;<\/span><span style=\"color: #E1E4E8\">: workspace_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;database_name&quot;<\/span><span style=\"color: #E1E4E8\">: name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #9ECBFF\">&quot;database_id&quot;<\/span><span style=\"color: #E1E4E8\">: id_<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            total_sqldatabases <\/span><span style=\"color: #F97583\">+=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">1<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Resumen final<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">&quot;Resumen de artefactos descubiertos&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Workspaces: <\/span><span style=\"color: #79B8FF\">{len<\/span><span style=\"color: #E1E4E8\">(workspaces)<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Lakehouses: <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">total_lakehouses<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Warehouses: <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">total_warehouses<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Bases de datos SQL: <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">total_sqldatabases<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">&quot;Carga finalizada&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n<\/div><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Una vez ejecutado este codigo, recibiremos un resultado similar al siguiente:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"318\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/01\/image-1.png?resize=569%2C318&#038;ssl=1\" alt=\"\" class=\"wp-image-2477\" style=\"width:376px;height:auto\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/01\/image-1.png?w=569&amp;ssl=1 569w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/01\/image-1.png?resize=300%2C168&amp;ssl=1 300w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Llegados a este punto, toda la informaci\u00f3n de los artefactos de Fabric queda disponible en el diccionario <code>FABRIC_CATALOG<\/code>. Este cat\u00e1logo vive en memoria y nos permite consultar de forma estructurada los <strong>lakehouses<\/strong>, <strong>warehouses<\/strong> y <strong>bases de datos SQL<\/strong> que se han encontrado, sin necesidad de recorrer Workspaces ni llamar de nuevo a la API.<\/p>\n\n\n\n<p>Esto resulta especialmente \u00fatil cuando queremos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>listar qu\u00e9 lakehouses tenemos disponibles,<\/li>\n\n\n\n<li>inspeccionar sus rutas de OneLake,<\/li>\n\n\n\n<li>o construir l\u00f3gica din\u00e1mica basada en los artefactos existentes.<\/li>\n<\/ul>\n\n\n\n<p>Por ejemplo, para mostrar los Lakehouses cargados, podemos ejecutar lo siguiente:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># Mostrar los nombres de los Lakehouses cargados en el cat\u00e1logo\nfor lakehouse_key in FABRIC_CATALOG&#91;\"lakehouses\"&#93;:\n    print(lakehouse_key)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># Mostrar los nombres de los Lakehouses cargados en el cat\u00e1logo<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> lakehouse_key <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">FABRIC_CATALOG<\/span><span style=\"color: #E1E4E8\">&#91;<\/span><span style=\"color: #9ECBFF\">&quot;lakehouses&quot;<\/span><span style=\"color: #E1E4E8\">&#93;:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(lakehouse_key)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Si ejecutas el c\u00f3digo anterior en un entorno con pocos artefactos, lo m\u00e1s probable es que el resultado sea el esperado. Sin embargo, en entornos m\u00e1s grandes puede ocurrir algo curioso: <strong>no aparecen todos los lakehouses (o warehouses, o bases de datos) que sabemos que existen<\/strong> y a los que tenemos acceso.<\/p>\n\n\n\n<p>Este comportamiento no suele estar relacionado con permisos ni con errores en el c\u00f3digo. El notebook se autentica correctamente y la API responde sin fallos aparentes. Aun as\u00ed, el n\u00famero de artefactos encontrados no siempre coincide con la realidad del entorno.<\/p>\n\n\n\n<p>La causa es menos evidente, pero muy com\u00fan cuando se empieza a trabajar con la API de Microsoft Fabric: <strong>las respuestas de la API est\u00e1n paginadas<\/strong>. Por defecto, muchas llamadas devuelven solo una primera p\u00e1gina de resultados, incluso cuando existen m\u00e1s elementos disponibles. Si el c\u00f3digo no gestiona expl\u00edcitamente esa paginaci\u00f3n, simplemente deja de ver todo lo que queda fuera de la primera respuesta.<\/p>\n\n\n\n<p>En otras palabras, el c\u00f3digo funciona\u2026 pero <strong>solo para la primera p\u00e1gina<\/strong>.<\/p>\n\n\n\n<p>Este detalle pasa desapercibido en entornos peque\u00f1os, pero se convierte en un problema real a medida que el n\u00famero de workspaces y artefactos crece.<\/p>\n\n\n\n<p>Para que el notebook sea realmente fiable, es necesario adaptar el c\u00f3digo para recorrer <strong>todas las p\u00e1ginas<\/strong> que devuelve la API de Fabric y no solo la primera. En el siguiente apartado veremos c\u00f3mo detectar y seguir el enlace <code>@odata.nextLink<\/code> que la API proporciona cuando existen m\u00e1s resultados, y c\u00f3mo encapsular esta l\u00f3gica para reutilizarla de forma limpia en todas las llamadas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Leyendo todas las p\u00e1ginas de la API de Fabric<\/h2>\n\n\n\n<p>Como hemos visto, la API de Microsoft Fabric no siempre devuelve todos los resultados en una \u00fanica respuesta. Cuando el n\u00famero de elementos es elevado, la API responde de forma <strong>paginada<\/strong> y solo devuelve una parte del total.<\/p>\n\n\n\n<p>En estos casos, la respuesta JSON incluye una propiedad llamada: <code>\"@odata.nextLink\"<\/code><\/p>\n\n\n\n<p>Este campo contiene la URL de la <strong>siguiente p\u00e1gina de resultados<\/strong>. Si el c\u00f3digo no comprueba ni sigue este enlace, el proceso se detiene tras la primera p\u00e1gina y el resultado queda incompleto.<\/p>\n\n\n\n<p>Por tanto, para recuperar <strong>todos<\/strong> los artefactos, el patr\u00f3n correcto es siempre el mismo:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Llamar a la URL inicial.<\/li>\n\n\n\n<li>Procesar los resultados devueltos.<\/li>\n\n\n\n<li>Comprobar si existe <code>@odata.nextLink<\/code>.<\/li>\n\n\n\n<li>Si existe, volver a llamar a esa URL.<\/li>\n\n\n\n<li>Repetir el proceso hasta que no haya m\u00e1s p\u00e1ginas.<\/li>\n<\/ol>\n\n\n\n<p>Esta l\u00f3gica es transversal a todas las llamadas que estamos haciendo (workspaces, lakehouses, warehouses y bases de datos SQL), por lo que tiene sentido encapsularla en una funci\u00f3n reutilizable. El siguiente c\u00f3digo implementa esa l\u00f3gica de forma gen\u00e9rica. Dada una URL inicial de la API de Fabric, devuelve <strong>todos los elementos<\/strong>, independientemente del n\u00famero de p\u00e1ginas:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>def get_all_pages(url, headers):\n    \"\"\"\n    Recupera todos los elementos de un endpoint paginado de la API de Fabric\n    siguiendo el enlace @odata.nextLink cuando existe.\n    \"\"\"\n    results = []\n\n    while url:\n        response = requests.get(url, headers=headers)\n\n        if response.status_code != 200:\n            raise Exception(\n                f\"Error en la llamada a la API: {response.status_code} - {response.text}\"\n            )\n\n        data = response.json()\n\n        # A\u00f1adir los resultados de la p\u00e1gina actual\n        results.extend(data.get(\"value\", []))\n\n        # Obtener la siguiente p\u00e1gina, si existe\n        url = data.get(\"@odata.nextLink\")\n\n    return results\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">def<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #B392F0\">get_all_pages<\/span><span style=\"color: #E1E4E8\">(url, headers):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    Recupera todos los elementos de un endpoint paginado de la API de Fabric<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    siguiendo el enlace @odata.nextLink cuando existe.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    &quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    results <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> []<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">while<\/span><span style=\"color: #E1E4E8\"> url:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> requests.get(url, <\/span><span style=\"color: #FFAB70\">headers<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\">headers)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> response.status_code <\/span><span style=\"color: #F97583\">!=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">200<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #F97583\">raise<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">Exception<\/span><span style=\"color: #E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Error en la llamada a la API: <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">response.status_code<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\"> - <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">response.text<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        data <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> response.json()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #6A737D\"># A\u00f1adir los resultados de la p\u00e1gina actual<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        results.extend(data.get(<\/span><span style=\"color: #9ECBFF\">&quot;value&quot;<\/span><span style=\"color: #E1E4E8\">, []))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #6A737D\"># Obtener la siguiente p\u00e1gina, si existe<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        url <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> data.get(<\/span><span style=\"color: #9ECBFF\">&quot;@odata.nextLink&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #E1E4E8\"> results<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>La funci\u00f3n <code>get_all_pages<\/code> debe colocarse <strong>despu\u00e9s de la autenticaci\u00f3n<\/strong> y <strong>antes de empezar a recuperar los workspaces<\/strong>, ya que ser\u00e1 utilizada por todas las llamadas posteriores.<br><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cuando el entorno crece: cuidado con el throttling<\/h2>\n\n\n\n<p>Una vez solucionado el problema de la paginaci\u00f3n, el notebook empieza a comportarse como esperamos: descubre todos los workspaces y, dentro de cada uno, todos los lakehouses, warehouses y bases de datos SQL disponibles. Sin embargo, en entornos medianos o grandes suele aparecer un nuevo problema, menos evidente pero igual de importante: <strong>el throttling de la API<\/strong>.<\/p>\n\n\n\n<p>Este problema se manifiesta normalmente en forma de errores <strong>429 (Too Many Requests)<\/strong>, acompa\u00f1ados de mensajes indicando que la solicitud ha sido bloqueada temporalmente por el servicio. El c\u00f3digo deja de ejecutarse.<\/p>\n\n\n\n<p>Este comportamiento no es un fallo del notebook ni un problema de permisos. Es el resultado directo de c\u00f3mo funciona la <strong>Fabric REST API<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Por qu\u00e9 ocurre el error 429 en Microsoft Fabric<\/h3>\n\n\n\n<p>Cuando ejecutamos el notebook, el n\u00famero de llamadas a la API crece r\u00e1pidamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>una o varias llamadas para listar los workspaces (con paginaci\u00f3n),<\/li>\n\n\n\n<li>por cada workspace, varias llamadas adicionales para:\n<ul class=\"wp-block-list\">\n<li>lakehouses,<\/li>\n\n\n\n<li>warehouses,<\/li>\n\n\n\n<li>bases de datos SQL<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>y, a su vez, cada una de estas llamadas puede estar paginada.<\/li>\n<\/ul>\n\n\n\n<p>En entornos con muchos workspaces y artefactos, el volumen total de peticiones en muy poco tiempo puede ser elevado. La API de Fabric aplica l\u00edmites para proteger el servicio y, cuando se superan, responde con un 429, bloqueando temporalmente nuevas solicitudes.<\/p>\n\n\n\n<p>Desde el punto de vista del notebook, todo esto ocurre de forma silenciosa hasta que, de repente, una llamada deja de responder correctamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Control de throttling y reintentos en la API de Fabric<\/h3>\n\n\n\n<p>Para evitar los errores 429 es necesario centralizar la l\u00f3gica de llamadas a la API en una funci\u00f3n que:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>detecte respuestas <strong>429 (Too Many Requests)<\/strong>,<\/li>\n\n\n\n<li>espere antes de reintentar,<\/li>\n\n\n\n<li>aplique una espera incremental si el problema persiste,<\/li>\n\n\n\n<li>y contin\u00fae el proceso sin interrumpir la ejecuci\u00f3n del notebook.<\/li>\n<\/ul>\n\n\n\n<p>La idea es sencilla: <strong>el resto del c\u00f3digo no debe saber que existe el throttling<\/strong>. Toda la complejidad queda encapsulada en una \u00fanica funci\u00f3n. Lo que tendr\u00edamos que hacer es modificar nuestra funci\u00f3n get_all_pages de la siguiente manera:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import time\nimport random\n\ndef get_all_pages(url, headers, max_retries=5, sleep_between_pages=0.2):\n    \"\"\"\n    Recupera todos los elementos de un endpoint paginado de la API de Fabric.\n    Gestiona errores 429 aplicando reintentos con espera incremental.\n    \"\"\"\n    results = []\n\n    while url:\n        retries = 0\n\n        while True:\n            response = requests.get(url, headers=headers)\n\n            if response.status_code == 200:\n                break\n\n            if response.status_code == 429 and retries &lt; max_retries:\n                wait_time = (2 ** retries) + random.uniform(0.5, 1.5)\n                time.sleep(wait_time)\n                retries += 1\n                continue\n\n            raise Exception(\n                f\"Error en la llamada a la API: {response.status_code} - {response.text}\"\n            )\n\n        data = response.json()\n        results.extend(data.get(\"value\", []))\n        url = data.get(\"@odata.nextLink\")\n\n        time.sleep(sleep_between_pages)\n\n    return results\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">import<\/span><span style=\"color: #E1E4E8\"> time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">import<\/span><span style=\"color: #E1E4E8\"> random<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">def<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #B392F0\">get_all_pages<\/span><span style=\"color: #E1E4E8\">(url, headers, max_retries<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #79B8FF\">5<\/span><span style=\"color: #E1E4E8\">, sleep_between_pages<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #79B8FF\">0.2<\/span><span style=\"color: #E1E4E8\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    Recupera todos los elementos de un endpoint paginado de la API de Fabric.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    Gestiona errores 429 aplicando reintentos con espera incremental.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    &quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    results <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> []<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">while<\/span><span style=\"color: #E1E4E8\"> url:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        retries <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">while<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">True<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> requests.get(url, <\/span><span style=\"color: #FFAB70\">headers<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\">headers)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> response.status_code <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">200<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">break<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> response.status_code <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">429<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">and<\/span><span style=\"color: #E1E4E8\"> retries <\/span><span style=\"color: #F97583\">&lt;<\/span><span style=\"color: #E1E4E8\"> max_retries:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                wait_time <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> (<\/span><span style=\"color: #79B8FF\">2<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">**<\/span><span style=\"color: #E1E4E8\"> retries) <\/span><span style=\"color: #F97583\">+<\/span><span style=\"color: #E1E4E8\"> random.uniform(<\/span><span style=\"color: #79B8FF\">0.5<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #79B8FF\">1.5<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                time.sleep(wait_time)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                retries <\/span><span style=\"color: #F97583\">+=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">continue<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #F97583\">raise<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">Exception<\/span><span style=\"color: #E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;Error en la llamada a la API: <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">response.status_code<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\"> - <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">response.text<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        data <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> response.json()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        results.extend(data.get(<\/span><span style=\"color: #9ECBFF\">&quot;value&quot;<\/span><span style=\"color: #E1E4E8\">, []))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        url <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> data.get(<\/span><span style=\"color: #9ECBFF\">&quot;@odata.nextLink&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        time.sleep(sleep_between_pages)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #E1E4E8\"> results<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Aunque este enfoque reduce considerablemente los errores de este tipo, en entornos con muchos workspaces o un volumen elevado de artefactos puede seguir produci\u00e9ndose alg\u00fan <code>429 \u2013 RequestBlocked<\/code>. Esto ocurre porque <strong>el servicio aplica l\u00edmites din\u00e1micos de consumo y puede bloquear temporalmente las llamadas aunque estemos gestionando la paginaci\u00f3n correctamente.<\/strong><\/p>\n\n\n\n<p>En estos casos, lo recomendable no es simplemente aumentar el n\u00famero m\u00e1ximo de reintentos, sino <strong>implementar una estrategia de espera progresiva<\/strong> y peque\u00f1os <code>sleep<\/code> controlados entre llamadas. De este modo respetamos los l\u00edmites del servicio, evitamos saturar la API y garantizamos un comportamiento verdaderamente robusto y reutilizable en escenarios enterprise. El c\u00f3digo de nuestra funci\u00f3n <code>get_all_pages<\/code> quedar\u00eda de la siguiente manera:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>def get_all_pages(url, headers, max_retries=5, sleep_between_pages=0.2):\n    \"\"\"\n    Recupera todas las p\u00e1ginas de un endpoint OData de Fabric\n    gestionando correctamente los bloqueos 429\n    \"\"\"\n\n    results = []\n\n    while url:\n        retries = 0\n\n        while True:\n            resp = requests.get(url, headers=headers)\n\n            # Petici\u00f3n correcta\n            if resp.status_code == 200:\n                break\n\n            # Si el servicio nos bloquea temporalmente (429)\n            if resp.status_code == 429 and retries &lt; max_retries:\n\n                # Si la API nos indica cu\u00e1nto esperar, usamos ese valor\n                retry_after = resp.headers.get(\"Retry-After\")\n\n                if retry_after:\n                    wait = int(retry_after)\n                else:\n                    # Espera progresiva (exponential backoff)\n                    wait = (2 ** retries)\n\n                time.sleep(wait)\n                retries += 1\n                continue\n\n            # Cualquier otro error lo lanzamos\n            raise Exception(f\"API error {resp.status_code}: {resp.text}\")\n\n        data = resp.json()\n        results.extend(data.get(\"value\", []))\n        url = data.get(\"@odata.nextLink\")\n\n        # Peque\u00f1a pausa entre p\u00e1ginas para evitar r\u00e1fagas de llamadas\n        time.sleep(sleep_between_pages)\n\n    return results\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">def<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #B392F0\">get_all_pages<\/span><span style=\"color: #E1E4E8\">(url, headers, max_retries<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #79B8FF\">5<\/span><span style=\"color: #E1E4E8\">, sleep_between_pages<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #79B8FF\">0.2<\/span><span style=\"color: #E1E4E8\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #9ECBFF\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    Recupera todas las p\u00e1ginas de un endpoint OData de Fabric<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    gestionando correctamente los bloqueos 429<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">    &quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    results <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> []<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">while<\/span><span style=\"color: #E1E4E8\"> url:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        retries <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #F97583\">while<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">True<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            resp <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> requests.get(url, <\/span><span style=\"color: #FFAB70\">headers<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\">headers)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #6A737D\"># Petici\u00f3n correcta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> resp.status_code <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">200<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">break<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #6A737D\"># Si el servicio nos bloquea temporalmente (429)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> resp.status_code <\/span><span style=\"color: #F97583\">==<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">429<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">and<\/span><span style=\"color: #E1E4E8\"> retries <\/span><span style=\"color: #F97583\">&lt;<\/span><span style=\"color: #E1E4E8\"> max_retries:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #6A737D\"># Si la API nos indica cu\u00e1nto esperar, usamos ese valor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                retry_after <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> resp.headers.get(<\/span><span style=\"color: #9ECBFF\">&quot;Retry-After&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> retry_after:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                    wait <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">int<\/span><span style=\"color: #E1E4E8\">(retry_after)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">else<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                    <\/span><span style=\"color: #6A737D\"># Espera progresiva (exponential backoff)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                    wait <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> (<\/span><span style=\"color: #79B8FF\">2<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">**<\/span><span style=\"color: #E1E4E8\"> retries)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                time.sleep(wait)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                retries <\/span><span style=\"color: #F97583\">+=<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">                <\/span><span style=\"color: #F97583\">continue<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #6A737D\"># Cualquier otro error lo lanzamos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">            <\/span><span style=\"color: #F97583\">raise<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">Exception<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;API error <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">resp.status_code<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">: <\/span><span style=\"color: #79B8FF\">{<\/span><span style=\"color: #E1E4E8\">resp.text<\/span><span style=\"color: #79B8FF\">}<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        data <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> resp.json()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        results.extend(data.get(<\/span><span style=\"color: #9ECBFF\">&quot;value&quot;<\/span><span style=\"color: #E1E4E8\">, []))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        url <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> data.get(<\/span><span style=\"color: #9ECBFF\">&quot;@odata.nextLink&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        <\/span><span style=\"color: #6A737D\"># Peque\u00f1a pausa entre p\u00e1ginas para evitar r\u00e1fagas de llamadas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">        time.sleep(sleep_between_pages)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #E1E4E8\"> results<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Con estas modificaciones, el notebook deja de fallar de forma intermitente y <strong>pasa a comportarse de manera estable incluso en entornos con muchos workspaces y artefactos<\/strong>. Seguimos accediendo exactamente a la misma informaci\u00f3n, pero ahora las llamadas a la API se realizan de forma controlada, respetando los l\u00edmites del servicio y gestionando autom\u00e1ticamente los bloqueos temporales. El resultado es un <strong>proceso predecible, reutilizable y v\u00e1lido<\/strong> para ejecutarse como notebook base dentro de una arquitectura compleja de Microsoft Fabric.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Otras optimizaciones posibles<\/h2>\n\n\n\n<p>Una vez que el notebook es capaz de \u00abver\u00bb todos los artefactos de forma fiable, el siguiente paso natural no siempre es a\u00f1adir m\u00e1s l\u00f3gica, sino <strong>reducir lo que no necesitamos<\/strong>. En muchos entornos, no todos los workspaces ni todos los tipos de artefactos son relevantes para todos los casos de uso.<\/p>\n\n\n\n<p>Por ejemplo, no todos los proyectos usan todos los artefactos de Fabric. Si en el proyecto en el que estamos trabajando no se utilizan <strong>bases de datos SQL<\/strong>, no tiene sentido hacer llamadas adicionales para escanearlas.<\/p>\n\n\n\n<p>Algo similar ocurre si, por ejemplo, no estamos interesados en escanear todos los workspaces de nuestro tenant. En este caso podr\u00edamos aplicar un filtro para solo tener en cuenta, por ejemplo, aquellos workspaces que empiezan por <code>\"DEV_\"<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>workspaces = [\n    ws for ws in workspaces\n    if ws&#91;\"displayName\"&#93;.startswith(\"DEV_\")\n]<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E1E4E8\">workspaces <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    ws <\/span><span style=\"color: #F97583\">for<\/span><span style=\"color: #E1E4E8\"> ws <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> workspaces<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> ws&#91;<\/span><span style=\"color: #9ECBFF\">&quot;displayName&quot;<\/span><span style=\"color: #E1E4E8\">&#93;.startswith(<\/span><span style=\"color: #9ECBFF\">&quot;DEV_&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Otra optimizaci\u00f3n posible, especialmente \u00fatil en entornos donde el notebook se ejecuta varias veces dentro de la misma sesi\u00f3n, es <strong>cachear el cat\u00e1logo de artefactos<\/strong> una vez generado.<\/p>\n\n\n\n<p>En su forma actual, el notebook:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>siempre llama a la API de Fabric<\/li>\n\n\n\n<li>siempre reconstruye el cat\u00e1logo completo<\/li>\n<\/ul>\n\n\n\n<p>En muchos escenarios esto no es estrictamente necesario, ya que la estructura de workspaces y artefactos no cambia con frecuencia durante una sesi\u00f3n de trabajo. En estos casos, se puede comprobar si el cat\u00e1logo ya existe y reutilizarlo, evitando llamadas innecesarias a la API.<\/p>\n\n\n\n<p>Un ejemplo sencillo de este enfoque ser\u00eda el siguiente:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>if \"FABRIC_CATALOG\" in globals():\n    print(\"Usando cat\u00e1logo de Fabric cacheado en la sesi\u00f3n\")\nelse:\n    print(\"Generando cat\u00e1logo de Fabric desde la API\")\n    FABRIC_CATALOG = {}\n    # aqu\u00ed ir\u00eda la l\u00f3gica de descubrimiento de artefactos<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">if<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #9ECBFF\">&quot;FABRIC_CATALOG&quot;<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">in<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #79B8FF\">globals<\/span><span style=\"color: #E1E4E8\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">&quot;Usando cat\u00e1logo de Fabric cacheado en la sesi\u00f3n&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">else<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #79B8FF\">print<\/span><span style=\"color: #E1E4E8\">(<\/span><span style=\"color: #9ECBFF\">&quot;Generando cat\u00e1logo de Fabric desde la API&quot;<\/span><span style=\"color: #E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #79B8FF\">FABRIC_CATALOG<\/span><span style=\"color: #E1E4E8\"> <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #E1E4E8\"> {}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #6A737D\"># aqu\u00ed ir\u00eda la l\u00f3gica de descubrimiento de artefactos<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones<\/h2>\n\n\n\n<p>En este art\u00edculo hemos visto c\u00f3mo <strong>centralizar el acceso a los artefactos de Microsoft Fabric<\/strong> y eliminar la necesidad de repetir rutas, IDs y configuraciones en cada notebook. Partiendo de una versi\u00f3n b\u00e1sica, hemos ido incorporando las mejoras necesarias para que el enfoque funcione correctamente en entornos reales: descubrimiento din\u00e1mico de artefactos, gesti\u00f3n de la paginaci\u00f3n de la API y control del throttling cuando el n\u00famero de llamadas empieza a crecer.<\/p>\n\n\n\n<p>El resultado es un <strong>notebook base<\/strong> que puede ejecutarse una sola vez por sesi\u00f3n y reutilizarse desde cualquier otro notebook del entorno. A partir de ese momento, basta con incluirlo mediante <code>%run \"NB_FabricCatalog\"<\/code> para disponer de todas las variables globales y del cat\u00e1logo de artefactos en memoria, sin necesidad de volver a realizar el proceso ni de duplicar l\u00f3gica.<\/p>\n\n\n\n<p>Esto cambia de forma significativa la manera de trabajar con Fabric. Los notebooks dejan de estar acoplados a rutas <code>abfss:\/\/...<\/code> escritas a mano o a IDs copiados de otros sitios, y pasan a apoyarse en <strong>un \u00fanico punto de entrada com\u00fan.<\/strong> Por ejemplo, si queremos acceder a la tabla de un lakehouse que se encuentra en otro workspace, basta con utilizar la ruta correspondiente construida en el cat\u00e1logo de la siguiente manera, manteniendo el c\u00f3digo limpio, f\u00e1cil de mantener y centrado en la l\u00f3gica de negocio:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e1e4e8;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>spark.read.format(\"delta\").load(\n    f\"{LH_EJEMPLO_BRONZE_PATH}\/dbo\/NombreTabla\"\n)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E1E4E8\">spark.read.format(<\/span><span style=\"color: #9ECBFF\">&quot;delta&quot;<\/span><span style=\"color: #E1E4E8\">).load(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    <\/span><span style=\"color: #F97583\">f<\/span><span style=\"color: #9ECBFF\">&quot;<\/span><span style=\"color: #79B8FF\">{LH_EJEMPLO_BRONZE_PATH}<\/span><span style=\"color: #9ECBFF\">\/dbo\/NombreTabla&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Es importante subrayar que este notebook no pretende ser una soluci\u00f3n r\u00edgida, sino <strong>una pieza base sobre la que construir<\/strong>. Decidir qu\u00e9 workspaces se incluyen, qu\u00e9 tipos de artefactos se buscan o qu\u00e9 informaci\u00f3n se expone forma parte del dise\u00f1o del entorno, no de una limitaci\u00f3n t\u00e9cnica. Las optimizaciones vistas permiten adaptar el mismo enfoque a realidades muy distintas.<\/p>\n\n\n\n<p>Con estas pr\u00e1cticas, el mismo patr\u00f3n puede escalar desde un entorno peque\u00f1o hasta una arquitectura de Microsoft Fabric mucho m\u00e1s compleja, manteniendo siempre <strong>un \u00fanico punto de acceso a los artefactos.<\/strong> El beneficio es claro: menos c\u00f3digo repetido, menos dependencias fr\u00e1giles y una base m\u00e1s coherente sobre la que seguir construyendo.<\/p>\n\n\n\n<p>En definitiva, no se trata de automatizar por automatizar, sino de <strong>introducir orden y consistencia<\/strong> en c\u00f3mo accedemos a los artefactos de Fabric. En entornos que crecen y evolucionan con el tiempo, ese orden acaba marcando la diferencia.<br><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2,63],"tags":[66,70,69,64,67,65,21,30,68],"post_series":[],"class_list":["post-2417","post","type-post","status-publish","format-standard","hentry","category-arquitectura-de-datos","category-fabric","tag-api","tag-bases-de-datos","tag-data-engineering","tag-fabric","tag-lakehouse","tag-notebooks","tag-python","tag-sql","tag-warehouse"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Admin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling\" \/>\n\t\t<meta property=\"og:description\" content=\"Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-01-26T11:22:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-02-13T13:24:08+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#article\",\"name\":\"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling\",\"headline\":\"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric\",\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/bicontrolling.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/image-1.png?fit=569%2C318&ssl=1\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#articleImage\",\"width\":569,\"height\":318},\"datePublished\":\"2026-01-26T12:22:18+01:00\",\"dateModified\":\"2026-02-13T14:24:08+01:00\",\"inLanguage\":\"es-ES\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#webpage\"},\"articleSection\":\"Arquitectura de datos, Fabric, API, Bases de datos, Data Engineering, Fabric, Lakehouse, Notebooks, Python, SQL, Warehouse\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/bicontrolling.com\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"position\":2,\"name\":\"Arquitectura de datos\",\"item\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#listItem\",\"name\":\"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#listItem\",\"position\":3,\"name\":\"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/\",\"name\":\"Admin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/00c17f691e05a0999c7ea23a9ae4aa6e7ae25f55cd91ae9629fe81a02ae98278?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Admin\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#webpage\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/\",\"name\":\"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling\",\"description\":\"Introducci\\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \\u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\\u00f1ado de una\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/01\\\/26\\\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\"},\"datePublished\":\"2026-01-26T12:22:18+01:00\",\"dateModified\":\"2026-02-13T14:24:08+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling","description":"Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una","canonical_url":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#article","name":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling","headline":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric","author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author"},"publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/01\/image-1.png?fit=569%2C318&ssl=1","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#articleImage","width":569,"height":318},"datePublished":"2026-01-26T12:22:18+01:00","dateModified":"2026-02-13T14:24:08+01:00","inLanguage":"es-ES","mainEntityOfPage":{"@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#webpage"},"isPartOf":{"@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#webpage"},"articleSection":"Arquitectura de datos, Fabric, API, Bases de datos, Data Engineering, Fabric, Lakehouse, Notebooks, Python, SQL, Warehouse"},{"@type":"BreadcrumbList","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","position":1,"name":"Inicio","item":"https:\/\/bicontrolling.com","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","position":2,"name":"Arquitectura de datos","item":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#listItem","name":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric"},"previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#listItem","position":3,"name":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric","previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}}]},{"@type":"Organization","@id":"https:\/\/bicontrolling.com\/#organization","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","url":"https:\/\/bicontrolling.com\/"},{"@type":"Person","@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author","url":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/","name":"Admin","image":{"@type":"ImageObject","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/00c17f691e05a0999c7ea23a9ae4aa6e7ae25f55cd91ae9629fe81a02ae98278?s=96&d=mm&r=g","width":96,"height":96,"caption":"Admin"}},{"@type":"WebPage","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#webpage","url":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/","name":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling","description":"Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/bicontrolling.com\/#website"},"breadcrumb":{"@id":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/#breadcrumblist"},"author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author"},"creator":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author"},"datePublished":"2026-01-26T12:22:18+01:00","dateModified":"2026-02-13T14:24:08+01:00"},{"@type":"WebSite","@id":"https:\/\/bicontrolling.com\/#website","url":"https:\/\/bicontrolling.com\/","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","inLanguage":"es-ES","publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"}}]},"og:locale":"es_ES","og:site_name":"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","og:type":"article","og:title":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling","og:description":"Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una","og:url":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/","article:published_time":"2026-01-26T11:22:18+00:00","article:modified_time":"2026-02-13T13:24:08+00:00","twitter:card":"summary","twitter:title":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric | Business Intelligence Controlling","twitter:description":"Introducci\u00f3n En entornos reales de Microsoft Fabric no trabajamos con un \u00fanico Lakehouse ni con un solo workspace. Lo habitual es convivir con m\u00faltiples workspaces, lakehouses, warehouses y bases de datos SQL, que van creciendo con el tiempo y se reutilizan desde distintos notebooks. El problema aparece cuando ese crecimiento no va acompa\u00f1ado de una"},"aioseo_meta_data":{"post_id":"2417","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-01-24 11:18:08","updated":"2026-02-13 13:41:45","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\" title=\"Inicio\">Inicio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/\" title=\"Arquitectura de datos\">Arquitectura de datos<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tCentralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Inicio","link":"https:\/\/bicontrolling.com"},{"label":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},{"label":"Centralizando accesos a Lakehouses y otros artefactos en Microsoft Fabric","link":"https:\/\/bicontrolling.com\/index.php\/2026\/01\/26\/centralizando-accesos-a-lakehouses-y-otros-artefactos-en-microsoft-fabric\/"}],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":430,"url":"https:\/\/bicontrolling.com\/index.php\/2020\/02\/20\/desnormalizando-consultas-de-forma-eficiente-2\/","url_meta":{"origin":2417,"position":0},"title":"Desnormalizando dimensiones de forma eficiente","author":"Admin","date":"20 febrero, 2020","format":false,"excerpt":"Como vimos en una entrada anterior, cuando dise\u00f1amos un modelo de datos anal\u00edtico, el enfoque principal debe situarse en lograr un dise\u00f1o que favorezca la simplicidad en la exploraci\u00f3n y agregaci\u00f3n de los datos, a la vez que en obtener un rendimiento \u00f3ptimo en la realizaci\u00f3n de consultas. Las estructuras\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":464,"url":"https:\/\/bicontrolling.com\/index.php\/2017\/12\/10\/tablas-de-medidas-en-power-bi-desktop\/","url_meta":{"origin":2417,"position":1},"title":"Grupos de medidas en Power BI Desktop","author":"Admin","date":"10 diciembre, 2017","format":false,"excerpt":"En numerosas ocasiones, cuando estamos trabajando con modelos de datos complejos, con muchas tablas y relaciones, y que requieren un n\u00famero considerable de medidas, es importante tener en cuenta el lugar de almacenamiento de las mismas. Por ejemplo, es probable que tras cargar al modelo de datos todas las consultas\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":362,"url":"https:\/\/bicontrolling.com\/index.php\/2018\/06\/28\/desnormalizando-consultas-de-forma-eficiente\/","url_meta":{"origin":2417,"position":2},"title":"Estructuras de datos en entornos anal\u00edticos","author":"Admin","date":"28 junio, 2018","format":false,"excerpt":"Cuando dise\u00f1amos un modelo de datos anal\u00edtico, uno de los aspectos clave a tener en cuenta corresponde al nivel de normalizaci\u00f3n\/desnormalizaci\u00f3n con que queremos dotar a la estructura del mismo. Es probable que la mayor\u00eda de los or\u00edgenes de datos que utilicemos a nivel profesional correspondan a sistemas de procesamiento\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/02\/image-3-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/02\/image-3-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/02\/image-3-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/02\/image-3-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/02\/image-3-1.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1568,"url":"https:\/\/bicontrolling.com\/index.php\/2020\/04\/19\/mostrar-la-ultima-fecha-de-actualizacion-en-power-bi\/","url_meta":{"origin":2417,"position":3},"title":"Mostrar la \u00faltima fecha de actualizaci\u00f3n en Power BI","author":"Admin","date":"19 abril, 2020","format":false,"excerpt":"Introducci\u00f3n En numerosas ocasiones, la primera pregunta que nos hace un usuario de un informe en Power BI es \u00bfest\u00e1n los datos actualizados? En un Panel del Servicio podemos configurar en cualquiera de las visualizaciones ancladas en el mismo, la capacidad de mostrar la hora de \u00faltima actualizaci\u00f3n de los\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/04\/Imagen-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/04\/Imagen-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/04\/Imagen-1.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":760,"url":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/","url_meta":{"origin":2417,"position":4},"title":"Estructuras jer\u00e1rquicas en tablas de hechos","author":"Admin","date":"13 diciembre, 2018","format":false,"excerpt":"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1002,"url":"https:\/\/bicontrolling.com\/index.php\/2019\/07\/04\/presupuestos-y-otros-datos-a-diferente-granularidad-en-power-bi\/","url_meta":{"origin":2417,"position":5},"title":"Integraci\u00f3n de previsiones presupuestarias y otros datos a diferente granularidad en Power BI","author":"Admin","date":"4 julio, 2019","format":false,"excerpt":"Introducci\u00f3n El modelado de previsiones presupuestarias constituye uno de los escenarios m\u00e1s desafiantes en el campo del dise\u00f1o y explotaci\u00f3n de modelos de datos en Power BI. Las estructuras de datos en dicha herramienta se basan en el motor de Analysis Services y en la tecnolog\u00eda xVelocity (previamente denominada VertiPaq);\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/07\/desviaciones-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/07\/desviaciones-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/07\/desviaciones-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/07\/desviaciones-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/07\/desviaciones-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/07\/desviaciones-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/2417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/comments?post=2417"}],"version-history":[{"count":25,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/2417\/revisions"}],"predecessor-version":[{"id":2516,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/2417\/revisions\/2516"}],"wp:attachment":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/media?parent=2417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/categories?post=2417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/tags?post=2417"},{"taxonomy":"post_series","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/post_series?post=2417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}