Mysql SQL中的“相交”列

Mysql SQL中的“相交”列,mysql,sql,Mysql,Sql,我有两个SQL语句,形式为SELECT sth FROM table WHERE condition。其中一个在我的系统的隐私规则中定义,表示当前用户可以访问的数据。另一个是由当前用户引入的,该用户希望从数据库中检索数据。因此,我想将这些句子的各个列相交,只检索用户请求并有权访问的句子 例如,假设我的策略中有SELECT*FROM表,它授予对所有内容的访问权,用户输入SELECT id,name FROM表。在本例中,我希望将SELECTID、name从表发送到数据库 另一个例子是,如果在策略集

我有两个SQL语句,形式为SELECT sth FROM table WHERE condition。其中一个在我的系统的隐私规则中定义,表示当前用户可以访问的数据。另一个是由当前用户引入的,该用户希望从数据库中检索数据。因此,我想将这些句子的各个列相交,只检索用户请求并有权访问的句子

例如,假设我的策略中有SELECT*FROM表,它授予对所有内容的访问权,用户输入SELECT id,name FROM表。在本例中,我希望将SELECTID、name从表发送到数据库

另一个例子是,如果在策略集中选择id、name、phone FROM table,并且用户提示SELECT name、location FROM table,那么我希望将SELECT name FROM table发送到数据库

SQL语法中是否有任何from来获取此信息

与行相关的WHERE条件部分更容易,我想我可以管理。但我不知道如何处理专栏


我现在的方法是在My.js上拆分查询字符串,但这很混乱,我希望通过SQL语法来完成。

在SQL中,做您特别想要的事情是很困难的。为什么?因为SQL查询返回一组固定的列。因此,基于用户访问列表删除列不是SQL内置的

你有选择的余地。一种选择是使用视图而不是单独的表进行访问。例如,也许每个人都可以访问:

create view as v_table_names 
    select name
    from employees;
但只有有限的人可以:

create view as v_table_names_salaries
    select name, salary
    from employees;
用户只能访问视图,不能访问基础表

另一种选择是将列清空。这将类似于:

select (case when ca.access_columns like '%[name]%' then name end) as name,
       (case when ca.access_columns like '%[salary]%' then salary end) as salary 
from employees e left join
     column_access ca
     on ca.table_name = 'employees' and
        ca.user_id = ?
这假设access表的列列表存储为[name][salary]

我并不真正推荐这种方法,因为它非常脆弱——对数据模型的更改需要一些工作才能正确实现。然而,它似乎与您所描述的最接近


MySQL还提供列级权限。但是,我认为它只是拒绝了试图访问未经允许的列的查询。

内部连接用户请求的内容和允许的内容。如何?我真的不知道如何正确使用内部连接再次阅读,似乎你要求的是列级访问控制,而不是行级,因此我对此没有任何想法。你想要的不是结果集而是输出列,即,你想要与输出结构、元数据相交。没有一个DBMS有用于此的工具。这应该由应用程序或数据库引擎来处理,而不是SQL。只有动态查询才能更改resultset中不可预测的列,因为在静态SQL中,标识符和数据是不同的实体。谢谢!我想我需要的是观点。非常感谢你。