【问题标题】:Firebird global temporary table (GTT), touch other tables?Firebird 全局临时表(GTT),碰其他表?
【发布时间】:2016-04-27 10:46:24
【问题描述】:

我有一个 Firebird 数据库 (v. 2.5),由于失去支持,我不能在数据库中创建过程、视图或表。

我的观点太长了:

Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255

我想我可以通过创建 GTT 来解决这个问题,对吧?

我的问题是,这个 GTT 会存储在数据库中吗? GTT什么时候被删除?我尝试了我的数据库副本并创建了一个 GTT,之后我关闭了连接并重新连接,并且 GTT 已经存在。我的 GTT 是否属于数据库中的主表?

【问题讨论】:

    标签: global firebird temp-tables global-temp-tables


    【解决方案1】:

    global temporary table 的定义是持久的(这就是为什么它被称为 global 而不是例如本地的)。全局临时表中的数据仅对填充它的事务 (on commit delete rows) 或填充它的连接 (on commit preserve rows) 可见。当事务结束或连接关闭时,数据被删除

    所以一旦创建了全局临时表的定义,就会一直存在于数据库中,直到它被删除。

    这是否违反了您与软件供应商的协议,我不能说。你需要问他们。

    【讨论】:

    • 我创建了一个 GTT,但是当我关闭连接并重新连接时,表已经在那里......我在表中写入了一些数据,首先是更新,然后是插入,但是即使我从 GTT 中选择 *,也没有要显示的数据,表格仍然是空的......我应该如何用数据填充表格?而且,也许 GTT 不会因为程序与数据库的永久连接而被丢弃?
    • 再次阅读我的答案。 GTT的定义是持久化的,创建后会继续存在;但是,数据是临时的,并且仅对当前连接可见,直到事务结束或连接结束。如果您在不同的事务或连接中执行插入和更新(取决于 GTT 定义),而不是执行选择,那么您将看不到任何数据(因为它是在不同的事务或连接中填充的)。跨度>
    • 我的声明是:创建全局临时表 t_1 (personalnr int, nachname varchar (50));插入 t_1 (personalnr, nachname) 选择personalnr, nachname from personal where personalnr = 26;选择 * 从 t_1;删除表 t_1;结果总是空的......我不认为它是在错误的会话中,是吗?
    • @SamEnbank GTT 的默认值为ON COMMIT DELETE ROWS,因此数据仅对插入数据的交易可见。如果您在不同的事务中进行选择(例如,使用自动提交、提交或回滚后或使用不同的连接),那么您将看不到数据。除此之外,您确实超出了原始问题的范围:考虑提出一个更详细的新问题。
    • 好的,我明白了...使用 Commit 它可以工作...我添加了以下行:在提交时保留行;犯罪;现在它可以工作了......现在我必须找出如何在网页中实现它;-/谢谢!
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2023-03-27
    • 1970-01-01
    • 2023-04-08
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多