【问题标题】:SQL Server global temporary table created via JDBC does not persist通过 JDBC 创建的 SQL Server 全局临时表不持久
【发布时间】:2012-09-26 06:24:06
【问题描述】:

有没有什么方法可以在我的连接关闭后使用 SQL Server 上的 JDBC 创建一个全局临时表?

我发现如果我使用 JTDS JDBC 驱动程序创建一个全局临时表,在我的连接关闭后它就不存在了:

String sql = "CREATE TABLE ##foobar([name] [nvarchar](50) NOT NULL)";
Statement stmt = connection.getConnection().createStatement();
stmt.execute(sql);

我想要的是一个对每个人都可见的表,并且将在连接之间持续存在,直到服务器重新启动。

【问题讨论】:

  • 嗯。这就是全局临时表的定义——当创建它的连接关闭并且没有其他连接引用它时,它就会消失。也许您需要一张普通的旧永久桌子?
  • @Damien_The_Unbeliever:也许他认为全局临时表的工作方式与 Oracle 中的相同......
  • 在 Oracle 的会话结束时它们不会被删除吗? oracle-base.com/articles/8i/temporary-tables.php
  • @hircus - 我的理解是,在 Oracle 中,它们被永久声明为 结构 - 它们的临时性质与它们包含的行有关。当会话关闭时,行消失,但表仍然存在。
  • 这就是你要找的东西吗,土库山?一个永久的结构,每个会话的行都是独立的?

标签: java sql-server jdbc


【解决方案1】:

您可以使用永久表、视图和登录触发器创建与 Oracle 样式临时表具有类似行为的东西:

create table dbo._Data (
    Session int not null constraint DF__Data DEFAULT (@@SPID),
    ColumnA int not null,
    ColumnB int not null
)
go
create view dbo.Data (
    ColumnA,
    ColumnB
)
with schemabinding
as
    select
        ColumnA,
        ColumnB
    from
        dbo._Data
    where
        Session = @@SPID
with check option
go
create trigger T_Data_Logon_Cleardown
ON ALL SERVER
FOR LOGON
AS
    delete from Database.dbo.Data
go

然后您对dbo.Data“表”执行所有操作。

这样的特点是每个会话的行都是隔离的,如果断开再重新连接,“表”就会是空的。

您无法自动清除事务边界上的行(如果这是您的首选选项 - 您必须手动删除)。也不完全相似,因为行将保留在表中,直到新会话声明旧会话 ID(因此稍后会进行清理,如果有的话)。但从客户的角度来看,它可能“足够接近”。

【讨论】:

    【解决方案2】:

    本地临时表仅对它们的创建者可见,在与 SQL Server 实例的同一连接期间,与首次创建或引用表时一样。用户断开与 SQL Server 实例的连接后,本地临时表将被删除。全局临时表在创建后对任何用户和任何连接都是可见的,并在所有引用它们的连接都关闭时被删除(参见MSDN docs

    在这种情况下,我需要的是一个对所有人可见的 Tempdb 永久表,并在服务器重新启动时被删除:

    CREATE TABLE tempdb..foobar([name] [nvarchar](50) NOT NULL)
    

    【讨论】:

    • 这不是答案,它是原始问题的延续。
    • 我想要一个对每个人都可见的表,并且将在连接之间持续存在,直到服务器重新启动 - 这个答案描述了如何通过在 tempdb 中创建一个表来做到这一点。
    猜你喜欢
    • 2014-09-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2015-04-25
    • 2016-04-02
    • 2010-10-25
    • 2013-05-26
    相关资源
    最近更新 更多