Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures 如何将参数从Asp.net应用程序传递到Power BI_Stored Procedures_Powerbi_Azure Sql Database_Multi Tenant_Powerbi Desktop - Fatal编程技术网

Stored procedures 如何将参数从Asp.net应用程序传递到Power BI

Stored procedures 如何将参数从Asp.net应用程序传递到Power BI,stored-procedures,powerbi,azure-sql-database,multi-tenant,powerbi-desktop,Stored Procedures,Powerbi,Azure Sql Database,Multi Tenant,Powerbi Desktop,我们正在使用asp.net mvc设计多租户web应用程序。我们的数据库存储在Azure上。我们已经在数据库中创建了安全策略,因此没有客户端可以看到另一个客户端的数据,并且在每个表中,我们都有每个条目的租户id 我们已经使用power bi创建了一些仪表板,正在使用包含租户id参数的sql存储过程访问数据。出于测试目的,我在power bi桌面内运行仪表板时提供租户id。现在,我们正试图将这些仪表板集成到我们的web应用程序中。为此,我们在web.config文件中做了必要的更改 问题是,我们将

我们正在使用asp.net mvc设计多租户web应用程序。我们的数据库存储在Azure上。我们已经在数据库中创建了安全策略,因此没有客户端可以看到另一个客户端的数据,并且在每个表中,我们都有每个条目的租户id

我们已经使用power bi创建了一些仪表板,正在使用包含租户id参数的sql存储过程访问数据。出于测试目的,我在power bi桌面内运行仪表板时提供租户id。现在,我们正试图将这些仪表板集成到我们的web应用程序中。为此,我们在web.config文件中做了必要的更改

问题是,我们将如何为登录到power bi的用户提供tenantID,以便用户只能查看该特定客户端的数据

提前谢谢

这取决于报告的格式(导入或DirectQuery)以及如何将其集成到应用程序中(、或)

如果存储模式为导入的,这意味着您的报告包含数据的副本。其结果是,您无法查询数据库并基于当前用户获取数据,因为数据的副本是一个副本,并且与查看您的报表的所有用户共享。因此,数据应该是针对所有租户的,您必须在每个用户会话中对其进行筛选。过滤可以通过两种方式进行——添加“正常”报告级过滤器或实现

过滤可以通过或来实现。第一种方法可用于安全嵌入,而后一种方法适用于使用嵌入式API。请注意,
发布到web
方法不支持URL筛选器。重要的是,以这种方式添加的过滤器将在中可见,用户可以修改或删除它(因此这不是保护数据的好方法)。如果使用API嵌入报表,可以通过在中设置
filterpanenabled:false
来隐藏过滤器窗格,但这也将隐藏所有其他过滤器,最终用户将只能使用您提供的视觉效果(例如报表中的切片器)对数据进行切片。另外请注意,安全嵌入要求报告的每个查看器都具有Power BI Pro许可证 (或者,如果发布报告的工作区分配了专用容量,即,或无电源BI许可证)

使用RLS,您将在报告中包含所有租户的所有数据,Power BI将为您过滤这些数据,因此用户将只看到与其租户相关的数据。这可以通过两种方式实现——为每个租户定义一个角色,并将最终用户包含在相应的角色中,或者在报告中使用DAX函数根据当前用户筛选数据


我的建议是使用RLS,这种情况下的好处是只需嵌入一个报告,根本不需要从应用程序向其传递任何参数。

您好,Andrey,感谢您的快速响应。问题是我们的数据库启用了安全策略,所以没有一个客户端可以看到其他客户端的数据。当我们想要执行任何脚本时,我们必须为我们想要查看其数据的特定客户机设置会话上下文。现在在这个场景中,在获取数据的同时在power bi中传递查询时,我们需要传递客户机id,以便我们可以获取该客户机id的数据。若我在运行查询时并没有设置会话上下文,它将不会返回任何结果。因此,在PowerBI for direct query中,我们必须传递clientId。您是如何设置此会话上下文的?当我们希望看到脚本EXEC sp_set_session_context@key=N'OwnerID',@value=@OwnerID;在这个@OwnerID中,是我们想要查看其数据的客户端id。这是一个自定义实现,Power BI不能直接使用它。即使您设法将应用程序中的
OwnerID
值传递给报表,它也会在与报表的每次交互中一遍又一遍地重新执行存储过程,这至少是低效的。通过这种实现,最好的解决方案是为每个租户创建一份单独的报告副本,在那里导入从该存储过程返回的数据,并根据当前用户在应用程序中嵌入适当的报告。哦,这不好。你能解释一下为什么存储过程会一次又一次地执行吗?这将非常有帮助。您是否建议每个所有者重新执行存储过程?