在数据库视图中应用动态 where 条件(oracle - 12c,mysql 5+)

Posted

技术标签:

【中文标题】在数据库视图中应用动态 where 条件(oracle - 12c,mysql 5+)【英文标题】:Apply dynamic where condition in the database view (oracle - 12c, mysql 5+) 【发布时间】:2020-05-12 11:16:59 【问题描述】:

我可以使用动态“WHERE”子句创建视图吗?这个 where 子句将根据用户和某些条件构建

这是我的交易表

+--------+----------+------------+
| Job ID | Customer | Department |
+--------+----------+------------+
| 1      | ABC      | Tanker     |
| 2      | ABC      | Dry        |
| 3      | MEX      | Tanker     |
| 4      | MEX      | Dry        |
+--------+----------+------------+
用户 A - 要求查看所有交易 用户 B - 需要查看 Tanker 部门的所有交易 用户 C - 需要查看 Tanker 部门但属于客户 ABC 的所有交易

我的用户明智的设置有标题详细信息

访问密钥 - 这是我用来过滤数据的每个段的二进制代码(第一个位置是部门,第二个是客户,0 表示全部,1 表示选择/访问受限)

标题:

+------+------------+
| User | Access key |
+------+------------+
| A    | 00         |
| B    | 10         |
| C    | 11         |
+------+------------+

明细表:

+------+------------+--------+
| User |   Segment  | Value  |
+------+------------+--------+
| B    | Department | Tanker |
| C    | Department | Tanker |
| C    | Customer   | ABC    |
+------+------------+--------+

现在我需要根据上述用户设置过滤数据。我可以根据用户动态构建 where 子句,然后使用 select 查询传递和执行,而不是修复视图中的 where 子句来获取数据吗? 请帮忙,我有 2 个数据库(mysql 和 Oracle)

即使是存档此要求的替代建议也非常受欢迎。

【问题讨论】:

【参考方案1】:

对于 Oracle,这听起来像是虚拟专用数据库的用例:https://docs.oracle.com/database/121/DBSEG/vpd.htm

或者对于管道函数:https://oracle-base.com/articles/misc/pipelined-table-functions。

如果可能的话,我个人会推荐 VPD。这是更安全的解决方案。

【讨论】:

以上是关于在数据库视图中应用动态 where 条件(oracle - 12c,mysql 5+)的主要内容,如果未能解决你的问题,请参考以下文章

MySql 视图

SQL Server 是不是在复杂视图中传播 WHERE 条件?

动态 SQL Where 条件,在 Powershell 脚本中

Queryover 的动态 Where 条件

sql server创建视图添加where条件,条件包含一个参数

如何使用动态 WHERE 子句将网格视图绑定到数据源?