奇怪地无法修改 DB2 列宽

humanity 2014-10-17 04:10:13
原来我的表中某个列长度是 varchar(64), 现在我准备加长到 256.
我的 'M' 表与 'W' (主表,和草稿版数据的表)表结构是一样的,唯一的差别是 'W' 表多一个列 M_IPKEY 它的值 = M 表的 IPKEY,但两个表之间没有外键关系。

一开始以以为记录总长度有什么问题,验证了一下,这些表中字段总长度是1126,我把一个字段加长后也才 1126 + 256 - 64 ,而我把 'W' 表中的 ATTR1/2/3/4/5_VAL 一共 5 个 ATTR?_VAL 列加长到 256 它都没出错,只是这个 'M' 表把其中一个 ATTR1_VAL 加长都不成功,我试了,实际上那个5个字段任意一个都不能加长,但从错误消息中看懂它到底想说什么。

表中没有 clob / blob 这些列,只有 TIME, DATE, SMALLINT, BIGINT 这几种类型的列。

谁提示下这可能是啥毛病,我仔细对比过 W 和 M (W 表多一个列,其它与 M 表完全相同的)如果是列超长那W 表应该先出错。

这条 SQL 成功了:
ALTER TABLE COWDOI000 ALTER ATTR1_VAL SET DATA TYPE VARCHAR(256);
ALTER TABLE COWDOI000 ALTER ATTR2_VAL SET DATA TYPE VARCHAR(256);
ALTER TABLE COWDOI000 ALTER ATTR3_VAL SET DATA TYPE VARCHAR(256);
ALTER TABLE COWDOI000 ALTER ATTR4_VAL SET DATA TYPE VARCHAR(256);
ALTER TABLE COWDOI000 ALTER ATTR5_VAL SET DATA TYPE VARCHAR(256);

这条 SQL 失败了:
ALTER TABLE COMDOI000 ALTER ATTR1_VAL SET DATA TYPE VARCHAR(256);


>[Error] Script lines: 1-1 --------------------------
DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=21, DRIVER=3.50.152
Message: Function not supported (Reason code = "21").. SQLCODE=-270, SQLSTATE=42997, DRIVER=3.50.152
...全文
594 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你先执行一个插入语句,我觉得这个表仅仅只是一个查询表,所以你不能对其进行操作! 你执行这个语句 $db2 list db directory $db2 list node directory 把截图发我看看
  • 打赏
  • 举报
回复
http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.messages.sql.doc/doc/msql00270n.html?cp=SSEPGG_9.7.0%2F2-6-27-0-167 你可以正常插入数据吗
  • 打赏
  • 举报
回复
你看一下IBM的APAR http://www-01.ibm.com/support/docview.wss?uid=swg1IV15375
humanity 2014-10-20
  • 打赏
  • 举报
回复
还是一样的。 db2 => connect to WLBUAT user db2 using db2 Database Connection Information Database server = DB2/NT64 9.7.3 SQL authorization ID = DB2 Local database alias = WLBUAT db2 => alter table COMDOI000 alter attr1_val set data type varchar(256) DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL0270N Function not supported (Reason code = "21"). SQLSTATE=42997 db2 =>
引用 10 楼 littlebrain4solving 的回复:
这里的错和本身语句没有关系,这里需要这样执行 直接DB2命令回车后再执行 >alter table COMDOI000 alter attr1_val set data type varchar(256)
  • 打赏
  • 举报
回复

这里的错和本身语句没有关系,这里需要这样执行

直接DB2命令回车后再执行
>alter table COMDOI000 alter attr1_val set data type varchar(256)
humanity 2014-10-20
  • 打赏
  • 举报
回复
我开发中一直用这个用户做所有的事情,包括改表结构,创建表,删除表,修改数据,插入,删除数据,备份,恢复,看 activity monitor,终止某个被事务阻塞的连接。

C:\>db2 connect to WLBUAT user db2 using db2

   Database Connection Information

 Database server        = DB2/NT64 9.7.3
 SQL authorization ID   = DB2
 Local database alias   = WLBUAT


C:\>db2 get authorizations

 Administrative Authorizations for Current User

 Direct SYSADM authority                    = NO
 Direct SYSCTRL authority                   = NO
 Direct SYSMAINT authority                  = NO
 Direct DBADM authority                     = NO
 Direct CREATETAB authority                 = NO
 Direct BINDADD authority                   = NO
 Direct CONNECT authority                   = NO
 Direct CREATE_NOT_FENC authority           = NO
 Direct IMPLICIT_SCHEMA authority           = NO
 Direct LOAD authority                      = NO
 Direct QUIESCE_CONNECT authority           = NO
 Direct CREATE_EXTERNAL_ROUTINE authority   = NO
 Direct SYSMON authority                    = NO

 Indirect SYSADM authority                  = YES
 Indirect SYSCTRL authority                 = NO
 Indirect SYSMAINT authority                = NO
 Indirect DBADM authority                   = YES
 Indirect CREATETAB authority               = YES
 Indirect BINDADD authority                 = YES
 Indirect CONNECT authority                 = YES
 Indirect CREATE_NOT_FENC authority         = NO
 Indirect IMPLICIT_SCHEMA authority         = YES
 Indirect LOAD authority                    = NO
 Indirect QUIESCE_CONNECT authority         = NO
 Indirect CREATE_EXTERNAL_ROUTINE authority = NO
 Indirect SYSMON authority                  = NO

C:\>
  • 打赏
  • 举报
回复
db2 命令后直接回车进入SQL执行,然后再执行这条语句试试! 你把你的db2用户的权限贴出来看看,命令的方式. 账户登陆登录 $db2 connect to [dbname] 获取当前登陆用户权限 $db2 get authorizations 截图出来看看哈!
humanity 2014-10-20
  • 打赏
  • 举报
回复
表中的这几个列:
humanity 2014-10-20
  • 打赏
  • 举报
回复
我也确实是用管理员账户登录的,这个命令在另一个机器上就正常地完成了,这台机器硬盘没有坏过,错误消息中说一个函数不支持,但实际我并没有使用任何函数,而且 coWdoi000 和 coHdoi000 都能正常地完成(表结构一样,H 表有一个 W_IPKEY 指向 W 表,但没有外键约束):

C:\>db2 connect to WLBUAT user db2 using db2

   Database Connection Information

 Database server        = DB2/NT64 9.7.3
 SQL authorization ID   = DB2
 Local database alias   = WLBUAT


C:\>db2 alter table COMDOI000 alter attr1_val set data type varchar(256)
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0270N  Function not supported (Reason code = "21").  SQLSTATE=42997

C:\>
引用 5 楼 littlebrain4solving 的回复:
你使用实例账户登录到DB服务器里面执行SQL命令看看; 记住在登录数据库的时候直接DBA登录; 查看数据库 $db2 list db directory 登录数据库 $db2 connect to [dbname] $db2 db2>ALTER TABLE COMDOI000 ALTER ATTR1_VAL SET DATA TYPE VARCHAR(256) 你这样试试!
  • 打赏
  • 举报
回复
不过好奇怪,你为什么用Materialized Query Table;好处是什么呢.
  • 打赏
  • 举报
回复
如果你想要看数据库结构的结构的话用DB2命令 $db2look -d DB_NAME -u USER_NAME -e -o FILE_TO_EXPORT.sql 你应该可以看到所有数据库之前相关的创建语句!
  • 打赏
  • 举报
回复
具体情况不是很清楚,你可以把关联取消掉后再试试!
humanity 2014-10-20
  • 打赏
  • 举报
回复
用 DB2 control center 怎么看不到这个 Materialized Query Table 当时的 DDL 源码,要怎么看它的源码呢?
humanity 2014-10-20
  • 打赏
  • 举报
回复
materialized query:
只有一个字段从这个表 COMDOI000 中取,并不是我当前要改的字段。


引用 15 楼 humanity 的回复:
我想起来了,2年前我做过一个实验,想让出报表时用一个缓存的 materialized view 存储数据,这样每天出报表之前刷新一下这个视图(表)的数据后再出报表,因为报表是只读式访问,应该不影响程序是如何填充原始表的数据的,只是不明白,我的 materialized view 并没有使用到我现在想改的这几个字段,DB2 不应该为些报错才对,就算我改了 materialized view 用到的字段,我并没有改动它原来的类型,只是放大字段宽度,这个修改是兼容的, DB2 只需要提示我们刷新一下 materialized view 就可以了(就像 oracle 一样,我改了原始表它会把相关的对象验证一次,如果有问题就标记为有错误,不允许访问,需要编辑一次 DDL 才可以),为什么它禁止我修改表结构呢?
humanity 2014-10-20
  • 打赏
  • 举报
回复
我想起来了,2年前我做过一个实验,想让出报表时用一个缓存的 materialized view 存储数据,这样每天出报表之前刷新一下这个视图(表)的数据后再出报表,因为报表是只读式访问,应该不影响程序是如何填充原始表的数据的,只是不明白,我的 materialized view 并没有使用到我现在想改的这几个字段,DB2 不应该为些报错才对,就算我改了 materialized view 用到的字段,我并没有改动它原来的类型,只是放大字段宽度,这个修改是兼容的, DB2 只需要提示我们刷新一下 materialized view 就可以了(就像 oracle 一样,我改了原始表它会把相关的对象验证一次,如果有问题就标记为有错误,不允许访问,需要编辑一次 DDL 才可以),为什么它禁止我修改表结构呢?
humanity 2014-10-19
  • 打赏
  • 举报
回复
这个倒没有,表最早不是我创建的,但我有所有的权限看和改所有的东西(这只是一个开发环境的数据库,自己恢复过来的),我们的程序设计中要求不要使用任何数据库特有的特性,因为我们是做产品的,期望软件运行在所有数据库平台上。所以这些分布式数据库特性是不会使用的,我们连表之间的外键都不允许使用,都有程序的持久层框架保证操作的次序的。
  • 打赏
  • 举报
回复
你使用实例账户登录到DB服务器里面执行SQL命令看看; 记住在登录数据库的时候直接DBA登录; 查看数据库 $db2 list db directory 登录数据库 $db2 connect to [dbname] $db2 db2>ALTER TABLE COMDOI000 ALTER ATTR1_VAL SET DATA TYPE VARCHAR(256) 你这样试试!
humanity 2014-10-18
  • 打赏
  • 举报
回复
我也不懂啥叫联邦啊,听都没听说过,反正我肯定没做过这操作。 我用 SQL 工具生成了 create script 来观察两个表也是一样的配置(仅是那些索引名字不一样,配置一样)。 所以确定了表中字段和索引主键这些都是完全相同的。 另外我的还有一个客户复制的测试数据库却能正常运行,而另一个也是客户复制的测试数据库因为之前某个硬盘坏了也不能运行,我就不明白难道硬盘坏了 DB2 检测不出来?按理说不像是这个原因吧,我这台机器上硬盘并没有坏过却跑不了。
  • 打赏
  • 举报
回复
DB2数据库的表之前都是你创建的吗?你是否对数据库目前的结构掌握了呀。 我之所以说"联邦"是因为有些需求是和远程数据库关联起来的, 在同一个数据库可以管理远程不同数据库的表;这些表你是无法修改并且插入数据的。
  • 打赏
  • 举报
回复
真没碰到过这个问题;表应该不是联邦过的表吧.

5,891

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧