将表从一个数据库复制到另一个
Posted
技术标签:
【中文标题】将表从一个数据库复制到另一个【英文标题】:copying a table from one database to another 【发布时间】:2009-02-04 13:20:09 【问题描述】:我正在尝试将我的一些表存档到同一服务器上的另一个数据库中。但是 INSERT INTO...SELECT...FROM 在构建时给了我一个错误(SQLSTATE = 42704)。该表存在于第二个数据库中。 有人能帮忙吗?
【问题讨论】:
您好,请您发布完整的 SQL 代码。您在使用 DB2 吗? 嗨 John 请看下面我的 SQL,其中 lqifcold=数据库名称,ls2user=schema INSERT INTO LQIFCOLD.LS2USER.TIN_TRIGGER_OUT (fld1...) (SELECT flds... FROM LS2DB001.LS2USER.TIN_TRIGGER_OUT ) ...是的,我正在使用 db2。谢谢约翰安妮塔 【参考方案1】:从您的问题中不清楚正在使用哪个版本的 DB2。我假设它是 Linux、Unix 和 Windows 版本。您似乎正在使用联合来链接两个数据库。
您的查询的 SELECT 部分是否从 LS2DB001 工作?值得尝试确定您遇到问题的数据库。
假设问题出在 LS2DB001 上,如果您定义了联合链接的用户对查询中的基表具有权限,则还要检查他们是否对系统目录表具有权限。如果不是,他们将无法解析和验证您是否可以运行查询。
【讨论】:
顺便说一句,是的,这种操作可以而且应该有效,它应该只是确定错误所在的问题。 嗨,马克,感谢您的意见。我已经尝试在两个数据库中使用这个 sql 构建存储过程。在 LQIFCOLD (TO db) 中,我得到 SQLSTATE=42704 未定义名称 LS2DB001.LS2USER.TIN_TRIGGER_OUT。在 LS2DB001 (FROM db) 中,我得到 SQLSTATE=42703 LQIFCOLD.LS2USER.TIN_TRIGGER_OUT 在使用的上下文中无效。【参考方案2】:我们已经破解了!如果使用以下脚本,则它可以工作。 LOAD 无需在复制的批次之间进行 COMMIT 即可工作。 ('Transaction Log full...'错误问题也解决了)
连接到 LS2DB001; 导出到 IXF 的“C:\temp\TIN_TRIGGER_OUT.IXF” 消息“C:\temp\TIN_TRIGGER_OUT.EXM” 选择 * 从 LS2USER.TIN_TRIGGER_OUT; 连接复位; 连接到 LQIFCOLD; 从 IXF 的“C:\temp\TIN_TRIGGER_OUT.IXF”加载 消息“C:\temp\TIN_TRIGGER_OUT.IMM” 插入到 LS2USER.TIN_TRIGGER_OUT 复制无索引模式自动选择; 犯罪; 连接重置;
【讨论】:
【参考方案3】:我在http://www.connx.com/products/connx/Connx%208.6%20UserGuide/CONNXCDD32D/DB2_SQL_States.htm 上找到了这个: 42704 未定义的对象或约束名称。修改 SQL 语法并重试。
如需更多帮助,请尝试更具体,例如粘贴完整的 sql 语句、表方案等。
【讨论】:
您好 Tehvan 谢谢,但我已经修改了各个方面的语法......运气不好。 请看我下面的 SQL,其中 lqifcold=数据库名称,ls2user=schema INSERT INTO LQIFCOLD.LS2USER.TIN_TRIGGER_OUT (fld1...) (SELECT flds... FROM LS2DB001.LS2USER.TIN_TRIGGER_OUT ) 【参考方案4】:你可以的
Select 'insert into tblxxxx (blabla,blabal) values(' + fld1 + ',' + fld2 + ',' ...... + ')'
From tblxxxxxx
将结果复制为文本脚本并在另一个数据库中执行。
【讨论】:
【参考方案5】:最好的方法是创建一个自定义脚本。根据表的大小(有多少记录),您可以选择所有数据到内存中,然后翻转它们,将它们插入到您首先创建的表的副本中,或者您可以将数据导出为一个 csv 文件或其他一些基于文本的文件,然后将其翻转以将数据插入到另一个表中。
如果您还没有某种正式的备份程序可以做到这一点,那么这将是您最好的选择。
注意:一些 db2 数据库,例如 iSeries 上的那些,实际上并没有“数据库”,它们有库。使用正确的用户配置文件,您可以同时访问两个库,将它们中的表连接在一起或进行
create table library/newFilename as
(select * from originallibrary/originalfilename) with data
但这仅适用于我相信的 iSeries。
【讨论】:
嗨瑞恩感谢您的帮助。但是,该表包含大约 100 万行。由于在它们之间提交数据的限制,导入/导出在此方面效果不佳。还有其他建议吗?安妮塔【参考方案6】:我正在写这个回复作为另一个答案,所以我有更多的空间。
我只能建议将这些步骤分解为它们的组件,并仔细检查错误发生在哪里。同样,我假设您使用的是联合:
a) 在您的 FROM 数据库中,以您用于联合链接的用户身份连接,您的选择是否有效?
b) 在您的 TO db 中,使用链接,选择是否有效?
c) 在您的 TO db 中,通过存储过程使用链接,选择是否有效?
d) 在您的 TO db 中,使用 INSERT...values(x,y,z),您可以插入到表中吗?
e) 在您的 TO db 中,通过存储过程,使用 INSERT...values(x,y,z),您可以插入吗?
如果没有更多信息,这是我能建议的最佳攻击路线。
【讨论】:
嗨,马克,再次感谢您的意见。我没有使用联合数据库。我们有一个非常基本的 DB2 设置和非常基本的工具来帮助编码。跨数据库处理只能使用联合数据库吗? 如果是这样,如果我只更改“TO”数据库会有什么影响?最后,我该如何做出这种改变?抱歉,我对 DB2 完全陌生。谢谢 如果您需要更多信息,请告诉我,我会发送给您。谢谢 嗨安妮塔。显然,我对你在做什么的假设走错了路。为了进一步提供帮助,您将不得不更详细地说明您在做什么。例如你是如何连接到数据库的,以及你的代码是如何工作的。 对不起马克,也许我没有解释清楚这个问题。练习的目的是将数据从 DB1 中的 TBL1 复制到 DB2 中的 TBL2。在我的项目中,我定义了两个数据库并授予了适当的身份验证。以上是关于将表从一个数据库复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章