Oracle PL/SQL开发人员语句有时不提交或;棍子;

Oracle PL/SQL开发人员语句有时不提交或;棍子;,oracle,plsqldeveloper,Oracle,Plsqldeveloper,我很抱歉,如果这是太模糊,但这是一个随机的问题,发生在许多类型的声明。谷歌和堆栈溢出搜索让我失望。这就是我正在经历的,我希望有人已经看到或至少听说了这种情况,并且可能知道解决方案 有时,我通过PL/SQL Developer针对Oracle数据库运行的语句并没有明显的韵律或理由,也不会“坚持”。上周,我对表A运行了一次更新,对update语句执行了一次commit,然后对表B执行了一次truncate,对表B执行了一次insert,然后执行了另一次commit。一切似乎都很顺利,因为我没有收到任

我很抱歉,如果这是太模糊,但这是一个随机的问题,发生在许多类型的声明。谷歌和堆栈溢出搜索让我失望。这就是我正在经历的,我希望有人已经看到或至少听说了这种情况,并且可能知道解决方案

有时,我通过PL/SQL Developer针对Oracle数据库运行的语句并没有明显的韵律或理由,也不会“坚持”。上周,我对表A运行了一次更新,对update语句执行了一次commit,然后对表B执行了一次truncate,对表B执行了一次insert,然后执行了另一次commit。一切似乎都很顺利,因为我没有收到任何错误。当然,我可以查询这些更改,并查看它们是否已做出。但是,在注销后又重新登录时,更改尚未提交。甚至truncate命令也没有“卡住”工作,并且truncate不需要执行提交

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

我的经理直接卷入了一起类似的案件。我运行了四个更新命令,并在其间提交了每个命令;然后他运行了一个select语句,结果发现我的更新实际上并没有提交

我希望我的一位飞越者同伴已经看到或听说过这个问题,或者至少能够为我提供一个方向,试图弄清这个问题的真相

“它开始对我产生负面影响,损害我在公司的声誉。”

如果你认为Oracle RDBMS是一种神奇的或随机的设备,或者更糟糕的是,它是有感知力的,并对你进行个人仇杀,那么你会对自己产生不良影响。计算机可能看起来有报复性,但这总是我们投射到它们身上;-)

改善你声誉的方法是对情况进行知情的调查。数据库不会随机丢失事务。那么,到底发生了什么

可能的罪犯:

  • 触发器:表
    A
    是否具有抑制某些SQL语句的更新触发器
  • 同义词:表
    A
    B
    真的是你认为的表吗
  • 所有权:这些表是否位于另一个启用了行级安全性的架构中(尽管如果违反策略,应该通过错误消息实现)
  • PL/SQL开发人员配置:IDE是隐藏错误消息还是您没有发现它们
  • 对象类型:表
    A
    B
    真的是表吗?它们是否可能是包含抑制某些SQL的而不是触发器的视图
  • 对象类型:或者
    A
    B
    可以是物化视图,并且您的会话具有
    QUERY\u REWRITE\u INTEGRITY=stale\u容差
    如果最后一个似乎有点牵强的话,还有其他类似的深奥解释,包括数据闪回、流水线函数和其他的胡言乱语。这是一种解释,表明同事在捉弄你

    如何进行:

  • 尝试不同的工具。SQL*Plus(或)可能会产生不同的结果。排除PL/SQL开发人员
  • 编写一些测试用例。努力建立可复制的测试用例:给定特定的设置,此SQL语句总是导致给定的结果(SQL总是坚持或不坚持)
  • 消除用于检查结果的查询中的bug或“搞笑”
  • 使用数据字典了解故障表的特征和相关对象。你需要了解导致不同结果的原因。更新保存的行与未保存的行的区别是什么
    我使用PL/sqldeveloper已经十多年了,我从来没有听说过它能成功地撤销
    truncate
    操作。如果能做到这一点,AA应该将其添加为菜单项。似乎更有可能是您对错误的数据库连接运行了命令。

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

  • 列出其连接到的数据库实例信息。例如:

    从v$instance中选择主机名、实例名、版本、启动时间

  • 将输出假脱机到文件(DBA通常使用sqlplus,但我相信PL/SQL开发人员也可以这样做)

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

  • 输出文件被保存到变更控制服务器(目录结构使获取给定实例和/或给定时间段的任何变更变得容易)

  • 在出现任何错误时退出:

    每当SQLERROR退出SQL.SQLCODE时

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

  • 显示eac