通过JDBC创建的SQL Server全局临时表无法持久化。

3

有没有办法在SQL Server上使用JDBC创建全局临时表,在我的连接关闭后仍然保留?

我发现如果使用JTDS JDBC驱动程序创建全局临时表,它会在我的连接关闭后消失:

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

我希望有一个表格,让所有人都能看到,并在服务器重启前一直保留。

2
这就是全局临时表的定义——在创建它的连接关闭后,它会消失,并且没有其他连接引用它。也许你需要一个普通的永久性表? - Damien_The_Unbeliever
@Damien_The_Unbeliever:也许他认为全局临时表的工作方式与Oracle相同... - user330315
它们在Oracle的会话结束时也会被删除吗?http://www.oracle-base.com/articles/8i/temporary-tables.php - michel-slm
@hircus - 我的理解是,在Oracle中,它们被永久地声明为结构体 - 它们的临时性质与它们所包含的行有关。当会话关闭时,行消失了,但表仍然存在。 - Damien_The_Unbeliever
这是你要找的吗,tukushan?一个永久性结构,每个会话都隔离行? - Damien_The_Unbeliever
我的错 - 你是对的,这是全局临时表的定义。我想要的是一个对所有人可见并且在服务器重启之前都会持久存在的表。 - tekumara
2个回答

0

本地临时表只在创建或引用表的同一连接到 SQL Server 实例的创建者中可见。用户断开与 SQL Server 实例的连接后,本地临时表将被删除。全局临时表在创建后对任何用户和任何连接都是可见的,并在所有引用它们的连接关闭后被删除(请参阅MSDN文档

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

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

这不是一个答案,而是原问题的延续。 - CodeChimp
我想要一个对所有人可见且在服务器重启前保持连接的表 - 这个答案描述了如何通过在tempdb中创建一个表来实现。 - tekumara

0
您可以使用永久表、视图和登录触发器创建具有类似于 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(因此清理稍后发生,如果有的话)。但从客户端的角度来看,它可能是“足够接近”的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接