【问题标题】:Crystal Report and ODP.Net水晶报表和 ODP.Net
【发布时间】:2011-04-30 21:05:38
【问题描述】:

我们在 Oralce 上使用 CR XI。我们在 DB 中应用 RLS(行级安全性)。 RLS 将基于我们在会话中设置的信息(通过调用 trans_pkg.set_username('abc'))来决定哪些数据行可以出现在数据集中。但 CR 似乎与 Oracle 有自己的联系。我们无法在 CR 查询数据之前运行如下包:trans_pkg.set_username('abc')。 它现在是我们系统的最大安全风险。 如果您有任何解决方案,请帮助我。

【问题讨论】:

  • 在用于驱动 Crystal Report 的 Oracle 存储过程中调用 trans_pkg.set_username('abc') 怎么样?
  • 你的意思是在 CR 中添加一个命令,比如 select trans_pkg.set_username('abc') from dual?如果我们在 CR 中有很多查询,每个查询将使用相同的 Oracle 会话还是自己创建?
  • 嗨 OMG Ponies,如果查询在所有查询中首先从双重运行中选择 trans_pkg.set_username('abc'),则您的解决方案是正确的。但是如何确保这个查询总是先运行呢?
  • 我认为您可以通过在报表标题中创建子报表来使其首先运行。你可能不希望它显示任何东西,但你不能抑制它,所以使用覆盖。 (自从我使用 Crystal Reports 已经一年了,我不确定这个确切的解决方案是否有效,但我知道我以前使用过类似的东西。)另一种方法是使用流水线函数作为表格,并在选择和管道行之前调用包。这听起来很复杂,但在 Oracle 中完成这一切通常比进行奇怪的 CR 格式化要好得多。
  • 嗨 jonearles,你能告诉我与你的第二个解决方案相关的链接吗?在您的第一个解决方案中,我们尝试了它,但问题是如何确保此查询在加载 CR 时首先运行?

标签: c# oracle crystal-reports


【解决方案1】:

由于您使用的是水晶报表查看器而不是 BO 服务器,因此您可以像 this answer 中那样使用 DataSets

如果您使用的是 BO 服务器,则需要创建另一个过程,该过程首先调用设置用户名,然后执行报表源过程或查询。

【讨论】:

  • 在我们的系统中,用户可以创建新的 rpt 文件并上传到报告服务器,其他人可以查看这些报告。在 rpt 文件中,有各种查询。我认为我们可以在这种情况下使用这种方法。
  • :) 对不起,我是这个论坛的新手。我会找到办法的:)
【解决方案2】:

我没有用crystal对抗oracle,只有sql server,但答案应该是一样的。为报表设置连接信息时,需要指定用户名和密码。数据库应使用此信息来识别用户并分配正确的访问权限。

【讨论】:

  • 感谢回复,我们的系统是3层,所有会话的用户数据库都是一样的。唯一的方法是在查询数据之前执行一些过程。有什么建议吗?
  • 你的意思是在数据库中执行一个“存储过程”,还是在你的数据访问层中执行一个过程,或者什么?无论如何,程序是做什么的?
  • 执行存储过程。我们有一个包 trans_pkg。在这个包中,我们有一个全局变量 g_username。 trans_pkg.set_username(p_username varchar2) 只需设置 g_username:= p_username;在 RLS 上下文中,我们只过滤该用户名可以访问的行。
  • 我猜您的报告使用的 Oracle 连接与您存储的 proc 调用不同,因此它看不到您的 g_username 变量。听起来您需要在报表运行之前使用 Crystal API 在报表中设置用户名。查看 Table.LogOnInfo.ConnectionInfo。您使用它来设置数据库名称、用户名和密码。同样,这适用于 sql server - 我的 Oracle 经验是有限的并且过去的方式,所以它可能不会以完全相同的方式工作。
  • 您如何使用 CR。报表是在 Business Object Server 中还是您使用的是水晶报表查看器
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多