我无法从驻留在 Synapse Analytics 中的数据库的特定视图连接和检索数据。数据库与显示的屏幕截图相同
我要
这是我的源代码
import pyodbc
server = '**********-ondemand.sql.azuresynapse.net'
database = 'DataverseEnhanced'
username = '********'
password = '*********'
driver= '{ODBC Driver 17 for SQL Server}'
def main():
connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}"
with pyodbc.connect(connection_string) as conn:
with conn.cursor() as cursor:
#cursor.execute("SELECT * FROM sys.databases")
query_1 = 'SELECT * FROM account'
cursor.execute(query_1)
query_2 = 'SELECT * FROM sys.databases'
cursor.execute(query_2)
# Fetch the results
results = cursor.fetchall()
# Print the results
print(results)
if __name__ == "__main__":
main()
谢谢大家提供任何线索。
---------------- 再次---------------------------- ----------
我只是想知道这里发布的解决方案是否适合我。
我的数据库和视图以不同的方式创建。
USE [dataverse_dynamicsprod_b07143b1d36945e0ae198260d58696] --Specify the name of the database corresponding to your Synapse Link for Dataverse
--=================================================================================================
--PROVIDE INPUT PARAMETERS:
--=================================================================================================
DECLARE
@EnrichedViewDatabase sysname, --Specify the name of the database in which views with enriched entities will be created
@EnrichedViewSchema sysname, --Specify the name of the database schema in which views with enriched entities will be created
@EnrichedColumnSuffix varchar(50), --Specify the suffix for columns enriched with human-readable descriptions. For example, the suffix of "label" will change a statecode column in the base table to a statelabel column in the enriched view.
@LanguageCode varchar(10), --Specify the language code for localized labels. For example, English - United States is 1033 (https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oe376/6c085406-a698-4e12-9d4d-c3b0ee3dbc4a)
@BaseTableSuffix varchar(50), --If applicable, specify the suffix in the names of the base tables or views (e.g., '_partitiond'). The default is an empty string.
@PreviewOnly bit --Indicate whether to preview the SQL Script (without creating the views) = 1 ; Create views = 0;
SET @EnrichedViewDatabase = 'DataverseEnhanced'
SET @EnrichedViewSchema = 'dbo'
SET @EnrichedColumnSuffix = 'label'
SET @LanguageCode = 1033
SET @BaseTableSuffix = ''
SET @PreviewOnly = 0
--=================================================================================================
-- Do not edit the script below this point
--=================================================================================================
--Get column metadata from the Lake Database managed by Synapse Link for Dataverse
--The column metadata will be stored as a JSON document in a scalar variable
--This is needed as a workaround for the limitation of not allowing system objects to be used in distributed queries
DECLARE @ColumnMetadata nvarchar(MAX), @ColumnMetadataSQL nvarchar(MAX)
--Define the SQL statement to retrieve column metadata from the Lake Database managed by Synapse Link for Dataverse
--Results will be stored as a JSON document in a variable
SET @ColumnMetadataSQL = 'SET @ColumnMetadataOUT = (
SELECT TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
ORDINAL_POSITION,
DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ''dbo''
AND TABLE_NAME NOT IN (''OptionsetMetadata'', ''GlobalOptionsetMetadata'',''StateMetadata'',''StatusMetadata'', ''TargetMetadata'')
AND TABLE_NAME LIKE ''%' + @BaseTableSuffix + '''
FOR JSON AUTO)'
DECLARE @ParmDefinition NVARCHAR(MAX);
SET @ParmDefinition = N'@ColumnMetadataOUT NVARCHAR(MAX) OUTPUT';
EXECUTE sp_executesql @ColumnMetadataSQL, @ParmDefinition, @ColumnMetadataOUT=@ColumnMetadata OUTPUT;
--Declare a variable to store a SQL statement for creating enriched views
DECLARE @SQL nvarchar(MAX) = ''
; WITH CM AS (
--Parse column metadata variable and construct a table based on its content
SELECT JSON_VALUE(CM.value, '$.TABLE_SCHEMA') AS TableSchema,
JSON_VALUE(CM.value, '$.TABLE_NAME') AS TableName,
LEFT(JSON_VALUE(CM.value, '$.TABLE_NAME'), LEN(JSON_VALUE(CM.value, '$.TABLE_NAME'))-LEN(@BaseTableSuffix)) AS EntityName,
JSON_VALUE(CM.value, '$.COLUMN_NAME') AS ColumnName,
CAST(JSON_VALUE(CM.value, '$.ORDINAL_POSITION') AS INT) AS OrdinalPosition,
JSON_VALUE(CM.value, '$.DATA_TYPE') AS DataType
FROM OPENJSON (@ColumnMetadata) AS CM
)
, OSM AS (
--Get Option Set Metadata
SELECT DISTINCT
EntityName,
OptionSetName,
QUOTENAME(EntityName + '_' + OptionSetName) AS Alias
FROM dbo.[OptionsetMetadata]
WHERE LocalizedLabelLanguageCode = @LanguageCode
)
...
所以,没有凭证名称。也就是说,两个GRANT不能执行
还有其他建议或建议吗?
非常感谢
无法连接到 Synapse Analytics 中的视图
根据您提供的信息,您想从 synapse Serverless SQL 池中的视图中读取数据。
我们知道,synapse 无服务器 SQL 池主要只处理具有外部源的数据,要从中读取数据,我们的用户需要对象的权限和范围内的凭据。
要授予用户访问权限,您可以使用以下代码:
GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::<credential-name> to <user>
GRANT SELECT ON OBJECT::<view-name> TO <user>;
否则你会遇到这个错误:
我创建示例视图的代码:
#created scoped credentials
CREATE DATABASE SCOPED CREDENTIAL AppCred
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<sas-token>';
#created eexternal data source
CREATE EXTERNAL DATA SOURCE [fsn2p_dlsg2p_dfs_core_windows_net]
WITH (
LOCATION = '<file-location>',
CREDENTIAL = AppCred
)
GO
#created view
CREATE VIEW demoview1 as SELECT * from
OPENROWSET(
BULK 'file1.csv',
DATA_SOURCE = 'fsn2p_dlsg2p_dfs_core_windows_net',
FORMAT = 'CSV',
HEADER_ROW = TRUE
) WITH (
[Id] VARCHAR (500),
[name] VARCHAR (100))AS [result];
访问视图的代码:
import pyodbc
# Define the connection string
server = '<synapse-workspace-name>-ondemand.sql.azuresynapse.net'
database = '<database-name>'
username = '<username>'
password = '<password>'
driver= '{ODBC Driver 17 for SQL Server}'
connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}"
# Establish a connection to the SQL pool
conn = pyodbc.connect(connection_string)
# Create a cursor object
cursor = conn.cursor()
# Execute a SQL query
query = 'SELECT * FROM demoview1'
cursor.execute(query)
# Fetch the results
results = cursor.fetchall()
# Print the results
print(results)
输出: