在数据库视图中应用动态 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+)的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 是不是在复杂视图中传播 WHERE 条件?
动态 SQL Where 条件,在 Powershell 脚本中