【问题标题】:Why below SQL statement fails to run on DB2 for z/OS?为什么以下 SQL 语句无法在 DB2 for z/OS 上运行?
【发布时间】:2010-12-16 07:41:33
【问题描述】:

下面的 SQL 语句在 DB2 LUW 9.7 上运行良好,但在 DB2 for z/OS 9.1 上运行失败,为什么以及如何使它工作?

CREATE TABLE HIERARCHY_TEST ( 
  HIER_URI VARCHAR(255) NOT NULL,
  PARENT_URI VARCHAR(255),
  TITLE VARCHAR(1000) NOT NULL,
  MIMETYPE VARCHAR(100),
  DESCRIPTION VARCHAR(1000),
  MODIFIED_BY VARCHAR(1000),    
  CONSTRAINT PK_SFIND_HIERARCHY PRIMARY KEY (HIER_URI ),
  CONSTRAINT FK_ND_HIERARCHY_1 FOREIGN KEY (PARENT_URI) REFERENCES HIERARCHY_TEST ( HIER_URI) 
)

我收到的错误消息是“DEV.FIND_HIERARCHY_TEST IS AN UNDEFINED NAME. SQLCODE=-204, SQLSTATE=42704, DRIVER=3.53.71”

谢谢。

【问题讨论】:

  • 我不确定 DB2 如何处理自引用外键;您是否尝试过在没有外键的情况下定义表,然后使用ALTER TABLE 添加约束?
  • 有趣的是,DEV.FIND_HIERARCHY_TEST 不是脚本中对象的名称——肯定是上面的 sn-p 引起了服务器的响应吗?
  • 感谢编辑我的帖子 El。我只是尝试在单独的 ALTER TABLE 语句中定义 PK 和 FK 并且它有效。但是我仍然不明白为什么原始语句不适用于所有 DB2 数据库。 DB2 for z/OS 和其他 DB2 数据库有什么区别?
  • @Will A,DEV是当前用户的默认schema,所以会自动添加到服务器返回的消息中。
  • 好的,太好了;我认为这可能是问题所在,因为我之前在其他 DBMS 中也遇到过类似的问题。

标签: sql db2


【解决方案1】:

此语句在 DB2 9.7 for Linux/UNIX/Windows 中有效的原因是 DB2 9.7 添加了一个称为自动重新验证的特性。 DB2 9.1 for z/OS 中不存在此功能。

此功能允许您创建依赖于另一个对象的对象,即使父对象尚不存在。 (即,您可以在尚不存在的表上创建视图,或者在您的情况下,您可以在尚不存在的表上定义外键)。

新创建的对象将无效,DB2 将在下次访问它时自动重新验证它。此行为由auto_reval 数据库配置参数控制。

正如 El Yobo 在上面的 cmets 中指出的,如果您需要在两种环境中运行完全相同的语句,则需要从 CREATE TABLE 中删除外键约束并将其作为单独的 ALTER TABLE 语句执行。

【讨论】:

  • 好消息;也许如果您从我的评论中添加解决方案,布鲁斯可以将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 2021-11-23
  • 2011-10-18
相关资源
最近更新 更多