我正在尝试将我的一些表存档到同一服务器上的另一个数据库中。但是 INSERT INTO...SELECT...FROM 在构建时给了我一个错误(SQLSTATE = 42704)。该表存在于第二个数据库中。有人能帮忙吗?
6 回答
我们已经破解了!如果使用以下脚本,则它可以工作。LOAD 无需在复制的批次之间进行 COMMIT 即可工作。('Transaction Log full...'错误问题也解决了)
连接到 LS2DB001;导出到“C:\temp\TIN_TRIGGER_OUT.IXF”的 IXF 消息“C:\temp\TIN_TRIGGER_OUT.EXM” SELECT * FROM LS2USER.TIN_TRIGGER_OUT; 连接复位;连接到 LQIFCOLD;从 IXF 消息“C:\temp\TIN_TRIGGER_OUT.IMM”的“C:\temp\TIN_TRIGGER_OUT.IXF”加载插入到 LS2USER.TIN_TRIGGER_OUT 复制无索引模式自动选择;犯罪; 连接复位;
从您的问题中不清楚正在使用哪个版本的 DB2。我假设它是 Linux、Unix 和 Windows 版本。您看起来正在使用联合来链接两个数据库。
您的查询的 SELECT 部分是否适用于 LS2DB001?值得尝试确定您遇到问题的数据库。
假设问题出在 LS2DB001 上,如果您定义了联合链接的用户对查询中的基表具有权限,则还要检查他们是否对系统目录表具有权限。如果不是,他们将无法解析和验证您是否可以运行查询。
我正在写这个回复作为另一个答案,所以我有更多的空间。
我只能建议将步骤分解为它们的组件,并通过查看错误发生的位置。同样,我假设您正在使用联合:
a)在您的 FROM 数据库中,以您用于联合链接的用户身份连接,您的选择是否有效?
b)在您的 TO db 中,使用链接,选择是否有效?
c)在您的 TO db 中,使用通过存储过程的链接,选择是否有效?
d) 在您的 TO db 中,使用 INSERT...values(x,y,z),您可以插入到表中吗?
e) 在您的 TO db 中,通过存储过程,使用 INSERT...values(x,y,z),您可以插入吗?
如果没有更多信息,这是我可以建议的最佳攻击方式。
我在http://www.connx.com/products/connx/Connx%208.6%20UserGuide/CONNXCDD32D/DB2_SQL_States.htm上找到了这个:42704 未定义的对象或约束名称。修改 SQL 语法并重试。
如需更多帮助,请尝试更具体,例如粘贴完整的 sql 语句、表方案等。
你可以做
Select 'insert into tblxxxx (blabla,blabal) values(' + fld1 + ',' + fld2 + ',' ...... + ')'
From tblxxxxxx
将结果复制为文本脚本并在另一个数据库中执行。
最好的方法是创建一个自定义脚本。根据表的大小(有多少记录),您可以选择所有数据到内存中,然后翻转它们,将它们插入到您首先创建的表的副本中,或者您可以将数据导出为一个 csv 文件或其他一些基于文本的文件,然后将其翻转以将数据插入到另一个表中。
如果您还没有某种正式的备份程序可以做到这一点,那么这将是您最好的选择。
注意:一些 db2 数据库,例如 iSeries 上的那些实际上没有“数据库”,它们有库。使用正确的用户配置文件,您可以同时访问两个库,将它们中的表连接在一起或执行
create table library/newFilename as
(select * from originallibrary/originalfilename) with data
但这仅适用于我相信的 iSeries。