Я пытаюсь удалить представление из своего блокнота 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.
Ошибка: произошла ошибка при вызове 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