如何使用 SELECT DELETE INSERT UPDATE 操作获取表的名称

Posted

技术标签:

【中文标题】如何使用 SELECT DELETE INSERT UPDATE 操作获取表的名称【英文标题】:How to get the Name of the Table with SELECT DELETE INSERT UPDATE operation 【发布时间】:2010-09-24 05:05:26 【问题描述】:

在给定 PL/SQL 代码的情况下,我想要一个工具或解决方案来找出在运行过程|函数或包时受影响的表。

这需要我通过知道运行代码将影响哪些所有表以及对它们执行的所有操作来提出更好的测试用例。

该解决方案甚至应该适用于过程调用过程。

输出可能是:

从:表 1 中选择

从:表 2 中删除

插入:表 3

调用另一个过程:

从:表 4 中选择

从:表 5 中删除

提前致谢:

【问题讨论】:

【参考方案1】:

对于运行前分析,如果您正在运行存储过程/包/函数,那么 DBA_DEPENDENCIES 表可以告诉您哪些对象“依赖”它,但这并不意味着它们可能必然受到影响,因为程序控制可以采取不同的方向。

运行后分析,您可以使用审计或跟踪来查看哪些表受到影响。

【讨论】:

依赖关系很好。我只想着追踪。但是,依赖项有利于覆盖所有可能的影响,从测试的角度来看,这可能是需要的!但递归问题很棘手:( 动态 SQL 不在 DBA_DEPENDENCIES 中跟踪。代码覆盖需要这两种解决方案。【参考方案2】:

有几种不同的方法可以获得部分或全部这些信息,但我想不出任何方法可以按照您指定的确切格式为您提供信息。

追踪

跟踪文件可以记录所有内容,但所有内容都存储在一个供人类阅读的文本文件中。有很多关于如何做到这一点的例子,这里有一个对我有用的例子:http://tonguc.wordpress.com/2006/12/30/introduction-to-oracle-trace-utulity-and-understanding-the-fundamental-performance-equation/

分析

您可以使用 DBMS_PROFILER 来记录程序调用了哪些行号。然后,您必须将行号加入 DBA_SOURCE 以获取实际命令。

V$SQL

这会记录执行的 SQL 语句。您可以按 PARSING_SCHEMA_NAME 搜索 SQL,并按 LAST_UPDATE_TIME 排序。但这不会得到 PL/SQL,而且 V$SQL 可能很难使用。 (SQL 可能会过期,或者可能被其他人加载等)

但要准确获得您想要的,所有这些解决方案都需要您编写一个程序来解析 SQL 和 PL/SQL。我确信有工具可以做到这一点,但我没有使用它们的经验。

您始终可以编写自己的自定义日志记录,但这是一项巨大的工作。最好的解决方案可能是要求开发人员充分记录每个函数,并列出所有代码的目的、输入、输出和副作用。

【讨论】:

【参考方案3】:

mysql 中,您可以通过在查询的开头添加关键字 EXPLAIN 来获取有关受影响的表的信息。它会给你不同的信息列为列。检查 Oracle 中是否有类似的功能可能对您的方案有所帮助。

【讨论】:

以上是关于如何使用 SELECT DELETE INSERT UPDATE 操作获取表的名称的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 SQL Server 中 INSERT、UPDATE、DELETE、SELECT 语句的速率?

SQLiteStatement 执行一个 SELECT / INSERT / DELETE / UPDATE

delete+insert 与 select+update哪个效率高

mybatis之@Select@Insert@Delete@Param

SQLite INSERT 和 DELETE 查询给出错误,但不是 SELECT 查询

oracle10G delete、insert和select同时进行会不会锁表?请高手指点!