Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

Reply
DoraAtRice
New Member

Issue to access Fabric DW from notebook by ODBC Driver

I encounter a problem accessing Fabrice Warehouse by Notebook (also in the same workspace) via ODBC Driver through the Application (SP).

 

The SP has created and granted the necessary API permission.

DoraAtRice_0-1744130338063.png

SP also add to workspace Manage Access as Member Role.

The notebook code likes below.

from azure.identity import ClientSecretCredential
import pyodbc
import struct

# Configuration - replace these with your values
tenant_id = "your-azure-ad-tenant-id"
client_id = "your-service-principal-client-id"
client_secret = "your-service-principal-secret"
server_name = "your-server-name.fabric.microsoft.com"  # e.g., "xxxxxx.fabric.microsoft.com"
database_name = "your-warehouse-name"

# 1. Get an access token using service principal credentials
credential = ClientSecretCredential(
    tenant_id=tenant_id,
    client_id=client_id,
    client_secret=client_secret
)

# The scope for Fabric SQL analytics endpoints
scope = "https://api.fabric.microsoft.com/.default"

# Get the access token
access_token = credential.get_token(scope).token

# 2. Connect to the warehouse using pyodbc with the access token
try:
    # Connect using the access token
    conn = pyodbc.connect(
        f"Driver={{ODBC Driver 17 for SQL Server}};"
        f"Server={server_name};"
        f"Database={database_name};",
        attrs_before={
            1256: bytearray(struct.pack("<i", len(access_token))) + access_token.encode("utf-16-le")
        }
    )
    
    # Create a cursor and execute a query
    cursor = conn.cursor()
    cursor.execute("SELECT 1 AS test")
    
    # Fetch and print results
    rows = cursor.fetchall()
    for row in rows:
        print(row)
        
except Exception as e:
    print(f"Error: {str(e)}")
finally:
    if 'conn' in locals():
        conn.close()

 

I ensure all values are correct, but always get authentication failed.... I do researches and try the solution online, but still stuck at this problem... 

Connection error: ('28000', '[28000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Could not login because the authentication failed. (18456) (SQLDriverConnect)')

 

1 ACCEPTED SOLUTION

 There is a way to execute UPDATE or INSERT statements on Microsoft Fabric Data Warehouse (formerly Synapse Data Warehouse) directly from a notebook — as long as both the notebook and warehouse are in the same Fabric workspace.

 

Solution: Use the %%sql or spark.sql() magic command in Fabric Notebooks

Option 1: %%sql Magic (Preferred for Fabric Notebooks)

 

If you're working in a Lakehouse or Warehouse notebook in Fabric, you can use:

 

%%sql

UPDATE my_table

SET column1 = 'new_value'

  • WHERE id = 123;

%%sql

INSERT INTO my_table (id, name)

VALUES (101, 'Alice');

 

Option 2: Use spark.sql() (if supported by context)

 

spark.sql("""

    UPDATE my_table

    SET column1 = 'new_value'

    WHERE id = 123

""")

This only works if:

 

  • The notebook is connected to the warehouse.

  • You're using the SQL engine context, not Spark-only tables.

Key Notes:

 

  • Make sure the table is a SQL Warehouse table, not a Delta/Lakehouse table if you're doing standard SQL.

  • Use USE WAREHOUSE or %sql USE WAREHOUSE if needed to switch context.

  • Security: Ensure you have the necessary permissions to UPDATE or INSERT.

 

 

 

 

 

View solution in original post

3 REPLIES 3
v-prasare
Community Support
Community Support

Hi @DoraAtRice, Microsoft Fabric Warehouses currently only support user-based AAD authentication (interactive or delegated tokens). That means:

  • Service Principals (client credentials flow) are not yet supported when connecting via SQL endpoints (ODBC, JDBC, etc.).

    Even if your SP has:

    • API permissions

    • Workspace Member role

    • Valid access token

    You will still get authentication failure when using it via ODBC.

     

     

     

     

    Thanks,

    Prashanth Are

    MS Fabric community support

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly and give Kudos if helped you resolve your query

Hi,

Thank you for the response.

Is there a way or solution that I can execute the SQL query (UPDATE/INSERT) to update Fabric DW via Notebook? Since the notebook and DW are in the same workspace, is there any direct way to do so? 

Thank you for the help!

 There is a way to execute UPDATE or INSERT statements on Microsoft Fabric Data Warehouse (formerly Synapse Data Warehouse) directly from a notebook — as long as both the notebook and warehouse are in the same Fabric workspace.

 

Solution: Use the %%sql or spark.sql() magic command in Fabric Notebooks

Option 1: %%sql Magic (Preferred for Fabric Notebooks)

 

If you're working in a Lakehouse or Warehouse notebook in Fabric, you can use:

 

%%sql

UPDATE my_table

SET column1 = 'new_value'

  • WHERE id = 123;

%%sql

INSERT INTO my_table (id, name)

VALUES (101, 'Alice');

 

Option 2: Use spark.sql() (if supported by context)

 

spark.sql("""

    UPDATE my_table

    SET column1 = 'new_value'

    WHERE id = 123

""")

This only works if:

 

  • The notebook is connected to the warehouse.

  • You're using the SQL engine context, not Spark-only tables.

Key Notes:

 

  • Make sure the table is a SQL Warehouse table, not a Delta/Lakehouse table if you're doing standard SQL.

  • Use USE WAREHOUSE or %sql USE WAREHOUSE if needed to switch context.

  • Security: Ensure you have the necessary permissions to UPDATE or INSERT.

 

 

 

 

 

Helpful resources

Announcements
MarchFBCvideo - carousel

Fabric Monthly Update - March 2025

Check out the March 2025 Fabric update to learn about new features.

March2025 Carousel

Fabric Community Update - March 2025

Find out what's new and trending in the Fabric community.

"); $(".slidesjs-pagination" ).prependTo(".pagination_sec"); $(".slidesjs-pagination" ).append("
"); $(".slidesjs-play.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-stop.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-pagination" ).append(""); $(".slidesjs-pagination" ).append(""); } catch(e){ } /* End: This code is added by iTalent as part of iTrack COMPL-455 */ $(".slidesjs-previous.slidesjs-navigation").attr('tabindex', '0'); $(".slidesjs-next.slidesjs-navigation").attr('tabindex', '0'); /* start: This code is added by iTalent as part of iTrack 1859082 */ $('.slidesjs-play.slidesjs-navigation').attr('id','playtitle'); $('.slidesjs-stop.slidesjs-navigation').attr('id','stoptitle'); $('.slidesjs-play.slidesjs-navigation').attr('role','tab'); $('.slidesjs-stop.slidesjs-navigation').attr('role','tab'); $('.slidesjs-play.slidesjs-navigation').attr('aria-describedby','tip1'); $('.slidesjs-stop.slidesjs-navigation').attr('aria-describedby','tip2'); /* End: This code is added by iTalent as part of iTrack 1859082 */ }); $(document).ready(function() { if($("#slides .item").length < 2 ) { /* Fixing Single Slide click issue (commented following code)*/ // $(".item").css("left","0px"); $(".item.slidesjs-slide").attr('style', 'left:0px !important'); $(".slidesjs-stop.slidesjs-navigation").trigger('click'); $(".slidesjs-previous").css("display", "none"); $(".slidesjs-next").css("display", "none"); } var items_length = $(".item.slidesjs-slide").length; $(".slidesjs-pagination-item > button").attr("aria-setsize",items_length); $(".slidesjs-next, .slidesjs-pagination-item button").attr("tabindex","-1"); $(".slidesjs-pagination-item button").attr("role", "tab"); $(".slidesjs-previous").attr("tabindex","-1"); $(".slidesjs-next").attr("aria-hidden","true"); $(".slidesjs-previous").attr("aria-hidden","true"); $(".slidesjs-next").attr("aria-label","Next"); $(".slidesjs-previous").attr("aria-label","Previous"); //$(".slidesjs-stop.slidesjs-navigation").attr("role","button"); //$(".slidesjs-play.slidesjs-navigation").attr("role","button"); $(".slidesjs-pagination").attr("role","tablist").attr("aria-busy","true"); $("li.slidesjs-pagination-item").attr("role","list"); $(".item.slidesjs-slide").attr("tabindex","-1"); $(".item.slidesjs-slide").attr("aria-label","item"); /*$(".slidesjs-stop.slidesjs-navigation").on('click', function() { var itemNumber = parseInt($('.slidesjs-pagination-item > a.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); });*/ $(".slidesjs-stop.slidesjs-navigation, .slidesjs-pagination-item > button").on('click keydown', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); var itemNumber = parseInt($('.slidesjs-pagination-item > button.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); }); $(".slidesjs-play.slidesjs-navigation").on('click', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); }); $(".slidesjs-pagination-item button").keyup(function(e){ var keyCode = e.keyCode || e.which; if (keyCode == 9) { e.preventDefault(); $(".slidesjs-stop.slidesjs-navigation").trigger('click').blur(); $("button.active").focus(); } }); $(".slidesjs-play").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-stop").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-play")) { $(".slidesjs-stop").focus(); } } }); $(".slidesjs-stop").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-play").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-stop")) { $(".slidesjs-play").focus(); } } }); $(".slidesjs-pagination-item").keydown(function(e){ switch (e.which){ case 37: //left arrow key $(".slidesjs-previous.slidesjs-navigation").trigger('click'); e.preventDefault(); break; case 39: //right arrow key $(".slidesjs-next.slidesjs-navigation").trigger('click'); e.preventDefault(); break; default: return; } $(".slidesjs-pagination-item button.active").focus(); }); }); // Start This code is added by iTalent as part of iTrack 1859082 $(document).ready(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); $("#tip2").attr("aria-hidden","true").addClass("hidden"); $(".slidesjs-stop.slidesjs-navigation, .slidesjs-play.slidesjs-navigation").attr('title', ''); $("a#playtitle").focus(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").mouseover(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").blur(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#playtitle").mouseleave(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#play").keydown(function(ev){ if (ev.which ==27) { $("#tip1").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); $("a#stoptitle").focus(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").mouseover(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").blur(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").mouseleave(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").keydown(function(ev){ if (ev.which ==27) { $("#tip2").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); }); // End This code is added by iTalent as part of iTrack 1859082