Synapse Note Book running failure Issue!!

Ashok Kumar Bollineni 46 Reputation points
2026-10-15T15:46:14.4133333+00:00

Hi All,

We have created tables in Synapse, such as EMP and DEPT. We are trying to load data from ADLS into the Synapse tables through a Synapse notebook. Inside the notebook, we are using a JDBC URL to connect to the Synapse Warehouse tables and write the data from ADLS. We are getting the error below. Could you please suggest how to overcome this issue?

Thank you.

Below is the error:

Py4JJavaError Traceback (most recent call last)

Cell In[5], line 17

  8 jdbc_url = "jdbc:sqlserver://res-synapse-02.sql.azuresynapse.net:1433;database=Dedicated;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"

 10 properties = {   

 11 		"user": "XXXXXX",    

 12 		"password": "XXXXX",    

 13 		"driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver"

 14 		}

---> 17 EmpDf.write.format("jdbc").option("url", jdbc_url).option("dbtable", "dbo.employees").mode("append").options(**properties).save()

 18 DeptDf.write.format("jdbc").option("url", jdbc_url).option("dbtable", "dbo.departments").mode("append").options(**properties).save()

File /opt/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py:1461, in DataFrameWriter.save(self, path, format, mode, partitionBy, **options)

1459 self.format(format)

1460 if path is None:

-> 1461 self._jwrite.save()

1462 else:

1463 self._jwrite.save(path)

File ~/cluster-env/env/lib/python3.11/site-packages/py4j/java_gateway.py:1322, in JavaMember.call(self, *args)

1316 command = proto.CALL_COMMAND_NAME +\

1317 self.command_header +\

1318 args_command +\

1319 proto.END_COMMAND_PART

1321 answer = self.gateway_client.send_command(command)

-> 1322 return_value = get_return_value(

1323 answer, self.gateway_client, self.target_id, self.name)

1325 for temp_arg in temp_args:

1326 if hasattr(temp_arg, "_detach"):

File /opt/spark/python/lib/pyspark.zip/pyspark/errors/exceptions/captured.py:179, in capture_sql_exception.<locals>.deco(*a, **kw)

177 def deco(*a: Any, **kw: Any) -> Any:

178     try:

--> 179 return f(*a, **kw)

180     except Py4JJavaError as e:

181         converted = convert_exception(e.java_exception)

File ~/cluster-env/env/lib/python3.11/site-packages/py4j/protocol.py:326, in get_return_value(answer, gateway_client, target_id, name)

324 value = OUTPUT_CONVERTER[type](answer[2:], gateway_client)

325 if answer[1] == REFERENCE_TYPE:

--> 326 raise Py4JJavaError(

327         "An error occurred while calling {0}{1}{2}.\n".

328         format(target_id, ".", name), value)

329 else:

330     raise Py4JError(

331         "An error occurred while calling {0}{1}{2}. Trace:\n{3}\n".

332         format(target_id, ".", name, value))

Py4JJavaError: An error occurred while calling o4369.save.

: com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 'sqladminuser'. ClientConnectionId:b3ffe4b9-ee4b-4d9e-8e9e-6dffa49f6151

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:356)

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:333)

at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:337)

at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:137)

at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:42)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:7722)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:6147)

at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:6079)

at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7832)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:5024)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:4412)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:3937)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:3700)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:2385)

at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1453)

at org.apache.spark.sql.execution.datasources.jdbc.connection.BasicConnectionProvider.getConnection(BasicConnectionProvider.scala:49)

at org.apache.spark.sql.execution.datasources.jdbc.connection.ConnectionProviderBase.create(ConnectionProvider.scala:102)

at org.apache.spark.sql.jdbc.JdbcDialect.$anonfun$createConnectionFactory$1(JdbcDialects.scala:161)

at org.apache.spark.sql.jdbc.JdbcDialect.$anonfun$createConnectionFactory$1$adapted(JdbcDialects.scala:157)

at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:50)

at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:48)

at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:75)

at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:73)

at org.apache.spark.sql.execution.command.ExecutedCommandExec.executeCollect(commands.scala:84)

at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.$anonfun$applyOrElse$1(QueryExecution.scala:232)

at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$5(SQLExecution.scala:132)

at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:220)

at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$1(SQLExecution.scala:101)

at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:961)

at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:68)

at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:232)

at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:220)

at org.apache.spark.sql.catalyst.trees.TreeNode.$anonfun$transformDownWithPruning$1(TreeNode.scala:461)

at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(origin.scala:76)

at org.apache.spark.sql.catalyst.trees.TreeNode.transformDownWithPruning(TreeNode.scala:461)

at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.org$apache$spark$sql$catalyst$plans$logical$AnalysisHelper$$super$transformDownWithPruning(LogicalPlan.scala:36)

at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning(AnalysisHelper.scala:267)

at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning$(AnalysisHelper.scala:263)

at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:36)

at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:36)

at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:437)

at org.apache.spark.sql.execution.QueryExecution.eagerlyExecuteCommands(QueryExecution.scala:220)

at org.apache.spark.sql.execution.QueryExecution.commandExecuted$lzycompute(QueryExecution.scala:204)

at org.apache.spark.sql.execution.QueryExecution.commandExecuted(QueryExecution.scala:198)

at org.apache.spark.sql.execution.QueryExecution.assertCommandExecuted(QueryExecution.scala:280)

at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:915)

at org.apache.spark.sql.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:416)

at org.apache.spark.sql.DataFrameWriter.saveInternal(DataFrameWriter.scala:383)

at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:253)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.base/java.lang.reflect.Method.invoke(Method.java:569)

at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)

at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374)

at py4j.Gateway.invoke(Gateway.java:282)

at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)

at py4j.commands.CallCommand.execute(CallCommand.java:79)

at py4j.GatewayConnection.run(GatewayConnection.java:238)

at java.base/java.lang.Thread.run(Thread.java:840)
Azure Blob Storage
Azure Blob Storage

An Azure service that stores unstructured data in the cloud as blobs.

0 comments No comments

1 answer

Sort by: Most helpful
  1. AI answer

    2026-10-15T15:47:04.2366667+00:00

    The notebook is reaching the Synapse SQL endpoint, but the dedicated pool is rejecting the SQL login, so validate or reset the sqladminuser credentials and retry with the Synapse-specific JDBC connection string.

    1. Validate or reset the SQL login

    1. In Azure portal, open Synapse workspaces and select the workspace.
    2. Open Properties or Overview and note the exact SQL admin username. The SQL administrator is created with the workspace and authenticates using a username and password.^1^
    3. If the displayed username is sqladminuser, select Reset SQL admin password, set a new password, and save it.^2^
    4. Update the notebook secret or password value. Avoid storing the password directly in notebook source.
    5. In Synapse Studio → Manage → SQL pools, verify that Dedicated is the actual pool/database name and that the pool is online.

    If Reset SQL admin password is disabled, check Azure portal → Synapse workspace → Microsoft Entra ID. When Support only Microsoft Entra ID authentication for this workspace is enabled, SQL username/password authentication cannot be used; either disable that setting if your security policy permits it or switch the notebook to Microsoft Entra authentication.^2^

    2. Correct the JDBC certificate hostname

    For a Synapse endpoint ending in .sql.azuresynapse.net, use hostNameInCertificate=*.sql.azuresynapse.net, not *.database.windows.net. Microsoft’s Synapse JDBC example uses that hostname pattern.^3^

    jdbc_url = (
        "jdbc:sqlserver://res-synapse-02.sql.azuresynapse.net:1433;"
        "database=Dedicated;encrypt=true;trustServerCertificate=false;"
        "hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30"
    )
    
    (EmpDf.write.format("jdbc")
        .option("url", jdbc_url)
        .option("dbtable", "dbo.employees")
        .option("user", sql_user)
        .option("password", sql_password)
        .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
        .mode("append").save())
    

    Test the same credentials against the Dedicated database with SSMS or another supported SQL client. If that login also fails, the issue is the account/database configuration rather than Spark. Error 18456 means login failure and calls for checking the username and password.^4^

    3. Check authorization only after login succeeds

    Authentication and table permissions are separate. After the login works, the principal needs INSERT on each destination table. Run this while connected as an administrator, replacing the principal as appropriate:

    GRANT INSERT ON OBJECT::dbo.employees TO [your_database_user];
    GRANT INSERT ON OBJECT::dbo.departments TO [your_database_user];
    

    A permission problem normally produces a permission-denied error rather than the current Login failed for user message.

    For larger transfers, use the built-in Azure Synapse Dedicated SQL Pool Connector for Apache Spark instead of generic row-oriented JDBC. It is included with Synapse, supports Python and Scala, supports append mode, and uses COPY when writing internal tables.^5^

    With Microsoft Entra authentication, create the signed-in user in the dedicated database and grant the documented write permissions. Then use:

    import com.microsoft.spark.sqlanalytics
    from com.microsoft.spark.sqlanalytics.Constants import Constants
    
    (EmpDf.write
        .option(Constants.SERVER,
                "res-synapse-02.sql.azuresynapse.net")
        .option(Constants.TEMP_FOLDER,
                "abfss://[Email]/staging")
        .mode("append")
        .synapsesql("Dedicated.dbo.employees"))
    

    The signed-in identity—or the workspace managed identity when a pipeline runs the notebook—also needs access to the staging storage. For internal-table writes, the connector documentation specifies storage access plus SQL permissions such as ADMINISTER DATABASE BULK OPERATIONS and INSERT on the target table.^5^


    References

    1. SQL Authentication in Azure Synapse Analytics
    2. User Name and Password for Dedicate SQL Pool - Microsoft Q&A
    3. Connect to Synapse SQL
    4. Troubleshoot Spark storage, file, and authentication errors
    5. Azure Synapse Dedicated SQL Pool Connector for Apache Spark
    AI-generated content may be incorrect. Read our transparency notes for more information.

    Was this answer helpful?

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.