PL / SQL Developer语句有时不会提交或“粘贴”

时间:2016-08-30 15:16:31

标签: oracle plsqldeveloper

如果这太模糊,我道歉,但这是一个随机问题,与许多类型的语句一起出现。谷歌和Stack Overflow搜索让我失望。这就是我所经历的,我希望那里的某个人已经看到或者至少听说过这种情况并且可能知道解决方案。

有时候,没有明显的押韵或理由,我通过PL / SQL Developer针对我们的Oracle数据库运行的语句不会“坚持”。上周我在表A上运行了更新,对update语句进行了提交,然后对表B进行了截断,对表B进行了插入,然后进行了另一次提交。一切似乎都很好,因为我没有收到任何错误。当然,我能够查询更改并查看它们是否已制作完成。但是,在注销然后重新登录时,尚未提交更改。即使truncate命令也没有“卡住” - 并且截断不需要执行提交。

一些可能有用的细节:我通过PL / SQL在我的团队使用的共享帐户上登录数据库服务器只能访问模式(每个服务器上有多个模式,每个模式都有一个共享登录/ PW)。在我的团队中的12个人中,我是唯一遇到此问题的人。我已经要求我们的数据库管理团队调查我的个人资料设置,并且被告知我的个人资料与我的队友的个人资料相同。我们被迫通过Citrix连接到我们的生产数据库服务器。我只能通过Citrix随时打开一个PL / SQL实例,因此我通常将PL / SQL连接到多个模式,但我从未在多个模式上同时运行SQL。我甚至不确定这是否可能,但我想我会提到它。我通常在PL / SQL中打开3-4个窗口,每个窗口都连接到不同的模式。

我的经理直接参与了一个与此类似的事情。我运行了四个更新命令,并在两者之间提交了每个命令;然后他运行了一个select语句,发现我的更新实际上没有提交。

我希望我的一位Overflowers家伙已经看到或听说过这个问题,或者至少可以为我提供一个方向来试图找到这个问题。

4 个答案:

答案 0 :(得分:3)

  

"它开始反映我的不良并损害了我在公司的声誉。"

对你来说真正反映的是,你会相信Oracle RDBMS是一个神奇的或随机的设备,或者更糟糕的是,它是有感情的并且会对你进行个人的仇杀。计算机可能看似报复,但总是我们投射到它们上面; - )

通过对情况进行知情调查,提高声誉的方法。数据库不会随机丢失事务。那么发生了什么?

可能的罪魁祸首:

  1. 触发器:表A是否有UPDATE触发器来抑制某些SQL?
  2. 同义词:表AB真的是你认为的表吗?
  3. 所有权:这些表是否在另一个模式中启用了行级安全性(如果违反策略,应该通过错误消息)?
  4. PL / SQL Developer配置:是IDE隐藏错误消息还是您没有发现它们?
  5. 对象类型:表AB真的是表吗?它们是否可以通过INSTEAD OF触发器来抑制某些SQL?
  6. 对象类型:或者AB可以是具体化的视图,您的会话是QUERY_REWRITE_INTEGRITY=stale_tolerated吗?
  7. 如果最后一个看起来有点拉伸,还有其他类似的深奥解释,涉及数据闪回,流水线功能和其他malarky。这一类解释表明一位同事正在恶作剧。

    如何进行:

    1. 尝试不同的工具。 SQL * Plus(或new SQL Command Line)可能会产生不同的结果。排除PL / SQL Developer。
    2. 写一些测试用例。努力建立可重现的测试用例:给定一定的设置,这个SQL语句总是会导致给定的结果(SQL总是坚持或总是没有)。
    3. 消除错误或" funnies"在用于检查结果的查询中。
    4. 使用数据字典了解麻烦表的特征和相关对象。您需要了解导致不同结果的原因。将UPDATE保持的行与不匹配的行的区别是什么?

答案 1 :(得分:1)

I have used PL/SQL Developer for over a decade and I have never known it silently undo successful truncate operations. If it can do that, AA should add it as a menu item. It seems more likely that you ran the commands against the wrong database connection.

答案 2 :(得分:1)

我能感受到你的沮丧,抱歉你正在经历这个。但是,我很惊讶,在一家大公司,您的变更控制流程就是这样。我不为大型跨国公司工作,但对生产数据库所做的任何更改都首先由管理层批准并由DBA(或在您的情况下,您的团队)运行。每个运行的脚本都做了一些事情:

  1. 列出与其连接的数据库实例信息。例如:

    从v $ instance;

  2. 中选择host_name,instance_name,version,startup_time
  3. 将输出假脱机到文件(DBA通常使用sqlplus,但我确信PL / SQL Developer也可以这样做)

  4. 显示当前日期和时间(在脚本的开头和结尾)

  5. 输出文件保存到更改控制服务器(目录结构可以轻松提取给定实例和/或给定时间范围的任何更改)

  6. 退出任何错误:

    WHERVER SQLERROR EXIT SQL.SQLCODE

  7. 需要在脚本后运行的任何其他检查(选择计数等)

  8. 显示正在运行的每个命令(设置echo on),包括提交!

  9. 所有这些都可以让您不仅验证脚本是否成功运行,而且还允许您进行CYOA。也许您可以与您的团队讨论如何在您自己的环境中实施这些功能。希望有所帮助。

答案 3 :(得分:0)

我无法知道我的问题是否已修复,但这是我所做的: 1.我联系了我们公司的Citrix团队,要求他们让我的团队能够打开多个PL / SQL实例。这已经完成,因此将消除对具有多个DB连接的一个实例的需要。 2.我联系了DBA,让他们删除我的旧配置文件,然后使用新的用户名创建一个新配置文件。

到目前为止,我在这些新条件下运行的所有SQL都很好。但是,我没有办法重新创建我遇到的问题,所以我只是继续关注我的业务并希望能够做到最好。

如果我从现在开始几个月后发现我没有再次遇到此问题,我会更新此帖子以防其他人遇到此问题。

感谢大家对操作员错误的指责(截图证明这不是操作员错误,但为什么你应该相信我,当我自己的同事指责我伪造屏幕截图时)和道德支持。