Невозможно удалить представление в бессерверном пуле SQL из Synapse Notebook

Я пытаюсь удалить представление из своего блокнота Synpase, используя подключение к бессерверному пулу SQL. Я выполнил инструкции из этого поста: Получите доступ к нашему встроенному бессерверному пулу SQL из нашего ноутбука и успешно установил соединение. Я могу запросить свои таблицы без каких-либо проблем. Однако, когда я пытаюсь удалить представление, я получаю эту ошибку: Произошла ошибка при вызове o4311.jdbc. Фрагмент кода, который я использовал ниже:

%%pyspark
server = 'REDACTED'
Port = 1433
Database = "REDACTED"
jdbcUrl = f"jdbc:sqlserver://{server}:{Port};databaseName = {Database};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"
token=TokenLibrary.getConnectionString("LinkTest")
query = "DROP VIEW dbo.TransformationTest"
conn_Prop = {
"driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver",
"accessToken" : token
}

df = spark.read.jdbc(url=jdbcUrl, table=query, properties=conn_Prop)
display(df)

Мне посоветовали использовать pyodbc для команд DDL, но я столкнулся с ошибкой TokenLibrary, в которой говорилось, что она не распознана, хотя она была распознана до использования pyodbc. Это используемый фрагмент кода:

%%pyspark
%pip install pyodbc
import pyodbc
CONNECTION CODE
token=TokenLibrary.getConnectionString("LinkTest")
conn_str = f'DRIVER = {{ODBC Driver 17 for SQL Server}};SERVER = {server},{Port};DATABASE = {Database};Authentication=ActiveDirectoryMsi'

# Establish a connection
conn = pyodbc.connect(conn_str)

# Create a cursor from the connection
cursor = conn.cursor()

# Define and execute the DROP TABLE query
drop_query = "DROP VIEW dbo.TransformationTest"
cursor.execute(drop_query)

# Commit the transaction
conn.commit()

# Close the connection
cursor.close()
conn.close()

Я получаю следующую ошибку: NameError: имя TokenLibrary не определено.

Я был бы признателен за любые рекомендации о том, как успешно удалить представление, или за любую информацию по устранению ошибки TokenLibrary с помощью pyodbc.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка: произошла ошибка при вызове o4311.jdbc.

Что касается вышеуказанной ОШИБКИ, убедитесь, что вы используете обновленные драйверы для jdbc.

Чтобы проверить драйвер, установленный в вашем ноутбуке Synapse, вы можете использовать следующие команды.

import pyodbc
pyodbc.drivers()

Полученные результаты:

['ODBC Driver 18 for SQL Server']

NameError: имя «TokenLibrary» не определено

Что касается TokenLibrary, я обнаружил аналогичную проблему: Ошибка доступа к Key Vault при выполнении Azure Synapse Notebook через Synapse Pipelines Пожалуйста, проверьте, помогает ли это вам.

Я также попробовал следующий подход:

Я создал представление в бессерверном пуле под названием [dbo].[populationView]

Я использовал приведенный ниже код, чтобы удалить представление в бессерверном пуле:

import struct
import pyodbc
server = 'Serverless SQL endpoint-ondemand.sql.azuresynapse.net'
dbname = "Serverlessdb"
auth_key = bytes(mssparkutils.credentials.getToken("DW"), 'utf8')
driver = "{ODBC Driver 18 for SQL Server}"
schema = "dbo"  # Specify the schema name
view_name = "populationView"
connection_string = f"DRIVER = {driver};SERVER = {server};DATABASE = {dbname}"
exp_token = b""
for i in auth_key:
    exp_token += bytes({i})
    exp_token += bytes(1)
token_struct = struct.pack("=i", len(exp_token)) + exp_token
import pyodbc
pyodbc.drivers()
with pyodbc.connect(connection_string, attrs_before = { 1256:token_struct }) as conn:
    conn.autocommit = True
    cursor = conn.cursor()
    cursor.execute("SELECT OBJECT_ID(?, 'V')", f"{schema}.{view_name}")  # Use 'V' for views
    object_id = cursor.fetchone()[0]
    if object_id is not None:
        print(f"Dropping VIEW {schema}.{view_name}")
        cursor.execute(f"DROP VIEW {schema}.{view_name}")
    else:
        print(f"{schema}.{view_name} does not exist")

Полученные результаты:

Dropping VIEW dbo.populationView

Другие вопросы по теме