sql - 如何获取有关 SQL Select 语句的信息

标签 sql

我想知道是否可以获取 select 语句中每个字段所来自的表/字段的真实名称。

假设您有两个表,“债权人”和“债务人”都有字段“代码”、“姓名”和“电话”。

如果用户输入以下sql语句:

SELECT Code AS CustomerCode, Name AS CustomerName, Phone AS ContactNumber FROM Debtors.

这将导致 SQL Server 返回字段名称 CustomerCode、CustomerName 和 ContactNumber。

是否可以从 SQL 服务器获取某种元数据,将每个字段映射到其真实名称及其来自的表?

以编程方式,给定一个 SQL select 语句,我希望能够确定每个字段的真实名称以及它们来自的表的真实名称。

我不想自己解析 SQL,因此我认为可能无法将语句发送到 SQL Server 并在没有行数据的情况下取回此信息。

我们正在尝试做的是实现表/字段级别的安全性。用户可以输入 sql 语句从一个表或跨多个表(使用联接)选择字段,并将结果显示在表中。这些字段会动态添加到网格控件中,但仅限于允许用户查看的字段。

如果用户连接多个表,我们如何以编程方式知道哪些字段来自哪个表?如果他们在 SQL 中使用别名,问题会变得更糟。

目前,该项目正在开发遗留的内部构建的 SQL 引擎(使用专有数据库),该引擎可以返回所有必需的表/字段信息,而无需行数据,因此应用程序安全模型的一部分是围绕此构建的。然而,如果我们不能让它工作,那么将这个应用程序转移到 SQL Server 之类的地方可能会很困难。

除了Sql server之外,还有其他sql数据库支持这种类型的功能吗?

最佳答案

据我所知,您无法获取该信息。

但是,通过在数据库本身中使用 GRANT/REVOKE 安全性,您可能可以在许多数据库中处理您的问题。假设用户登录到数据库本身(而不仅仅是您的应用程序),许多 DBMS 允许您对表中的受限列授予 SELECT 权限。使用该技术,如果用户为列指定别名,它就不会欺骗服务器。

快速谷歌一下就会发现,至少 PostgreSQL、SQL Server 和 Oracle 提供了基于用户 ID 的列级 GRANT SELECT 保护。

顺便说一句,这个问题很有趣。

关于sql - 如何获取有关 SQL Select 语句的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4834890/

相关文章:

sql - oracle SQL查询可以执行从表中选择的字符串查询吗?

SQL:如果记录列表存在,返回 "true"?

mysql - 添加外键时出错

android - 将Android App与本地机器上存储的Mysql数据库连接

mysql - 给定两个区域的经度和纬度,如何找到它们之间的距离(以米为单位)。如何在 SQL 中查询..?

用于随机分配调查的 SQL Server 存储过程

sql - Date_Sub(NOW) 错误

sql - 如何实现一个 "Is Current"需求的一对多关系

python - 如何将SQL表数据转换为字典

php - 在 Laravel 表单中获取具有其他值的行的 ID