【问题标题】:Force timeout SQL Oracle on users response对用户响应强制超时 SQL Oracle
【发布时间】:2020-05-08 23:06:22
【问题描述】:

我有一个 PL/SQL 过程,它有几个提示,要求用户输入一些信息进行处理。例如,项目编号、业务单位等。

这也会在脚本末尾提示确认。

这允许多个用户依赖同一个脚本来大量设置数据以进行测试(项目等......)。但是,肯定有一些粗心的用户会让 COMMIT 确认提示保持打开状态,从而锁定记录并阻止其他用户工作。

当我们访问已锁定记录的用户时(我们只能在 DBA 团队的帮助下识别他们,这需要花费大量时间),我们会要求他们关闭标签,并且它总是显示:

有没有办法在特定时间间隔过去时强制超时(通过相同的 SQL 脚本),这会调用我的 WHENEVER SQLERROR 处理程序进行自动回滚?

【问题讨论】:

  • 此时如何锁定任何东西?您的应用程序只是提示输入变量。为什么你认为会有锁?请出示。
  • 在执行任何 DML 操作之前,您需要在程序开始时获取替换值,因此在获取替换变量的输入之前不会锁定任何内容
  • PL/SQL 完全在数据库中运行,没有“提示输入”的能力。在我看来,您好像是从 Toad 调用该过程。将是 Toad 正在执行提示,并且它会根据程序的规范执行此操作,甚至在调用程序之前。因此,等待响应时不会发生锁定。
  • 我没有检索锁列表的权限,但是当他们执行查询(通常不是这个)并且他们没有提交时,它会锁定记录。我正在添加我们识别某人未完成交易的一种方式。我想我错过了提交或回滚的提示,我需要为其设置超时。
  • 这完全是TOAD的一个功能。为什么不用其他输入参数预先要求提交提示变量?

标签: sql oracle plsql


【解决方案1】:

您可以尝试将用户的IDLE_TIME 限制在短时间内。我用了 1 分钟来演示:

CREATE PROFILE couldntcareless LIMIT IDLE_TIME 1;
ALTER USER xxx PROFILE couldntcareless;

如果用户现在空闲超过一分钟,更改将回滚并终止会话。

社交提示:我假设您不会使用此功能结交任何朋友。我通常通过查看数据库来识别违规用户,联系他们并告诉他们他们确实阻止了同事的工作。通常他们不知道这个事实,很尴尬,并倾向于改善他们的行为。如果您没有 v$locked_object 的权限,请与 DBA 交谈以创建一个视图,以过滤掉您的表并让您可以使用此视图。

技术提示:系统参数RESOURCE_LIMIT 必须设置为强制执行这些限制,显然直接在 PDB 中,您可能需要重新启动数据库:

ALTER SYSTEM SET RESOURCE_LIMIT=TRUE SCOPE=BOTH;

【讨论】:

  • 感谢您的回答。不幸的是,我刚刚发现我没有创建或更改配置文件的权限。
  • 是的,这是 DBA 团队的传统任务。通常很容易说服他们创建一个限制 CPU 或空闲时间的特殊配置文件,特别是因为它可以节省他们的工作(您写道“我们只能在 DBA 团队的帮助下识别他们,这需要很多时间”)。因此,您有一个近乎理想的观点来争辩“请创建个人资料或更敏感地识别未响应的用户”:-)
猜你喜欢
  • 2016-08-10
  • 2010-10-22
  • 2019-08-04
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多