代码之家  ›  专栏  ›  技术社区  ›  glasnt

“On commit delete rows”的全局临时表不包含任何数据

  •  2
  • glasnt  · 技术社区  · 15 年前

    我在一个创建脚本中定义了一个全局临时表(GTT),使用提交时删除行的选项。我希望能够让不同的用户在GTT中看到自己的数据,而不是其他人会话的数据。这在我们的测试环境中非常有效。

    但是后来,我部署了GTT作为客户端数据库功能更新的一部分。客户打电话给我,很不高兴,很担心,因为GTT已经没有任何数据了,他们也不知道为什么。

    具体来说,如果有人这样做了:

    insert into my_GTT (description) values ('Happy happy joy joy')
    

    数据库将响应:

    1 row inserted. 
    

    但是,如果同一最终用户尝试:

    select * from my_GTT
    

    0 rows returned.
    

    3 回复  |  直到 8 年前
        1
  •  3
  •   hon2a    10 年前

    ON COMMIT DELETE ROWS =一个事务中的数据

    ON COMMIT PRESERVE ROWS =一个数据库会话中的数据(一个用户有2个会话=2个会话=不同的内容)

    如果GTT定义为 ,则在任何显式提交或隐式提交(=隐式提交=在任何DLL命令之后,包括例如truncate table、alter index、add partition、modify column、exchange partition)之后,它将为空:

    CREATE GLOBAL TEMPORARY TABLE GTT__TEST (A NUMBER) ON COMMIT DELETE ROWS;
    INSERT INTO GTT__TEST VALUES (1); 
    SELECT * FROM GTT__TEST; -- 1 ROW; 
    COMMIT; -- commit = delete rows
    SELECT * FROM GTT__TEST; -- 0 ROWS; 
    INSERT INTO GTT__TEST VALUES (1); 
    SELECT * FROM GTT__TEST; -- 1 ROW; 
    ALTER TABLE GTT__TEST MODIFY A NOT NULL; -- DLL = commit = delete rows
    SELECT * FROM GTT__TEST; -- 0 ROWS 
    

    如果GTT定义为 ,它将保存数据直到会话结束:

    DROP TABLE GTT__TEST; 
    CREATE GLOBAL TEMPORARY TABLE GTT__TEST (A NUMBER) ON COMMIT PRESERVE ROWS;
    INSERT INTO GTT__TEST VALUES (1); 
    SELECT * FROM GTT__TEST; -- 1 ROW 
    COMMIT; 
    SELECT * FROM GTT__TEST; -- 1 ROW
    
        2
  •  2
  •   Damien_The_Unbeliever    15 年前

    在每个语句都自动提交的目标环境中是否启用了某些设置?

    (我的经验是在SQL Server中,这是默认值,但我知道在Oracle中,默认值是在显式提交之前保持事务打开。注意,我从2000年起就没碰过甲骨文)

        3
  •  0
  •   Gary Myers    15 年前

    我认为达米恩是对的,有一个自动提交。我唯一能想到的另一个选择是某种类型的连接池问题(即从一个单独的会话到insert执行select)

    推荐文章