亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle12c -Invisible Columns 測試

2024-08-29 13:55:00
字體:
來源:轉載
供稿:網友

http://www.anbob.com/archives/2083.html

Oracle 12c release 1版本引入新功能可隱藏列(invisible columns),這個特性有很多的爭議,不明白為什么ORACLE會推出這個特性,因為這個特性可能會帶來很多麻煩,列默認是顯示的可以通過create table 或alter table 控制此特性,下面我來演示一下此特性。

anbob@PDB1>create table test(id int,id1 int,id2 int,id3 int);Table created.anbob@PDB1>insert into test values(1,2,3,4);1 row created.anbob@PDB1>commit;Commit complete.anbob@PDB1>desc test; Name                                      Null?    Type ----------------------------------------- -------- ---------------------------- ID                                                 NUMBER(38) ID1                                                NUMBER(38) ID2                                                NUMBER(38) ID3                                                NUMBER(38) anbob@PDB1>select * from test;                  ID                  ID1                  ID2                  ID3-------------------- -------------------- -------------------- --------------------                   1                    2                    3                    4anbob@PDB1>alter table test modify id2 invisible;Table altered.anbob@PDB1>select * from test;                  ID                  ID1                  ID3-------------------- -------------------- --------------------                   1                    2                    4				   anbob@PDB1>desc test; Name                          Null?    Type ----------------------------- -------- -------------------- ID                                     NUMBER(38) ID1                                    NUMBER(38) ID3                                    NUMBER(38)anbob@PDB1>alter table test modify id1 invisible;Table altered.anbob@PDB1>desc test; Name                          Null?    Type ----------------------------- -------- -------------------- ID                                     NUMBER(38) ID3                                    NUMBER(38) anbob@PDB1>insert into test values(11,12,13,14);insert into test values(11,12,13,14)            *ERROR at line 1:ORA-00913: too many valuesanbob@PDB1>insert into test(id,id1,id2,id3) values(11,12,13,14);1 row created.anbob@PDB1>commit;Commit complete.anbob@PDB1>select * from test;                  ID                  ID3-------------------- --------------------                   1                    4                  11                   14anbob@PDB1>select id,id1,id2,id3 from test;                  ID                  ID1                  ID2                  ID3-------------------- -------------------- -------------------- --------------------                   1                    2                    3                    4                  11                   12                   13                   14

note:從上面可以看出這個特性隱藏的也只是對于desc 和 select “*” 的顯示和未指定列名insert 時隱藏列無效, 如果把隱藏列重新顯示會有什么影響?接著下面演示

查看兩列隱藏后的建表DDL

anbob@PDB1>select dbms_metadata.get_ddl('TABLE','TEST') from dual;DBMS_METADATA.GET_DDL('TABLE','TEST')--------------------------------------------------------------------------------  CREATE TABLE "ANBOB"."TEST"   (    "ID1" NUMBER(*,0) INVISIBLE,        "ID2" NUMBER(*,0) INVISIBLE,        "ID" NUMBER(*,0),        "ID3" NUMBER(*,0)   ) SEGMENT CREATION IMMEDIATE  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1  BUFFER_POOL DEFAULT Flash_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)  TABLESPACE "USERS"  

NOTE:也看出此時的建表語句列順序已經是變化的。

看一下col$基表的變化,col#是顯示的順序,在我以前的日志中有寫個修改列順序”oracle 修改列的前后順序”http://www.anbob.com/archives/757.html

tip:The data dictionary COL$ table contains one row for each table column. Each row has three column numbers:COL# – external column numberINTCOL# – internal column numberSEGCOL# – segment column number

-- 修改前,所有列正常顯示sys@ORA12C>select name,col#,intcol#,segcol#,TO_CHAR (property,'XXXXXXXXXXXX') from col$ where obj#=91771NAME        COL#              INTCOL#              SEGCOL# TO_CHAR(PROPE---------- ----- -------------------- -------------------- -------------ID             1                    1                    1             0ID1            2                    2                    2             0ID2            3                    3                    3             0ID3            4                    4                    4             0-- 修改后,隱藏ID1,ID2列sys@ORA12C>/NAME        COL#              INTCOL#              SEGCOL# TO_CHAR(PROPE---------- ----- -------------------- -------------------- -------------ID             1                    1                    1             0ID1            0                    2                    2     400000020ID2            0                    3                    3     400000020ID3            2                    4                    4             0

note:注意修改隱藏列會把col#更新為0,同時其它不為0值并且大于修改col#的列號col#會相應減1

anbob@PDB1>alter table test drop column id4 ;Table altered.anbob@PDB1>insert into test values(11,12,13,14);insert into test values(11,12,13,14)            *ERROR at line 1:ORA-00913: too many valuesanbob@PDB1>insert into test(id,id1,id2,id3) values(11,12,13,14);1 row created.anbob@PDB1>commit;Commit complete.anbob@PDB1>alter table test modify id2 visible;Table altered.anbob@PDB1>alter table test modify id1 visible;Table altered.sys@ORA12C>select name,col#,intcol#,segcol#,TO_CHAR (property,'XXXXXXXXXXXX') from col$ where obj#=91771;NAME        COL#              INTCOL#              SEGCOL# TO_CHAR(PROPE---------- ----- -------------------- -------------------- -------------ID             1                    1                    1             0ID1            4                    2                    2             0ID2            3                    3                    3             0ID3            2                    4                    4             0anbob@PDB1>alter table test modify id1 invisible;Table altered.anbob@PDB1>alter table test add id4 int;Table altered.anbob@PDB1>alter table test modify id1 visible;Table altered.anbob@PDB1>desc test; Name             Null?    Type ---------------- -------- --------------------------------- ID                        NUMBER(38) ID3                       NUMBER(38) ID2                       NUMBER(38) ID4                       NUMBER(38) ID1                       NUMBER(38)anbob@PDB1>select * from test;                  ID                  ID3                  ID2                  ID4                  ID1-------------------- -------------------- -------------------- -------------------- --------------------                   1                    4                    3                                         2                  11                   14                   13                                        12

note:注意此時的列順序沒有還原為原來的順序,如果程序使用的select * from 方式而控制列順序顯示,將讓人誤解。如果是insert tablename values() 方式呢? 如果對于一些老程序而使用了insert 未指定列, 而且你使用了此特性做了一個隱藏再顯示的小測試, 這下麻煩可就大了, 對于只隱藏可能會提示你列數不匹配,如果隱藏再顯示,導致列順序錯亂,而有恰巧列類型一致數據庫insert 成功,那數據寫錯了列又無提示,對于客戶數據是災難性的。

anbob@PDB1>alter table test drop column id4 ;Table altered.anbob@PDB1>select * from test;                  ID                  ID3                  ID2                  ID1-------------------- -------------------- -------------------- --------------------                   1                    4                    3                    2                  11                   14                   13                   12anbob@PDB1>insert into test(id,id1,id2,id3) values(21,22,23,24);1 row created.anbob@PDB1>commit;Commit complete.anbob@PDB1>select * from test;                  ID                  ID3                  ID2                  ID1-------------------- -------------------- -------------------- --------------------                   1                    4                    3                    2                  11                   14                   13                   12                  21                   24                   23                   22

note:對于程序嚴格指定了列名的就沒有任何影響,下面我們來dump 一下存儲結構,看這些順序會不會影響列的存儲順序。

anbob@PDB1>select dbms_rowid.ROWID_RELATIVE_FNO(rowid) file#, dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#,id from test;               FILE#               BLOCK#                   ID-------------------- -------------------- --------------------                  10                  143                    1                  10                  143                   11                  10                  143                   21sys@ORA12C>alter system dump datafile 10 block  143;block_row_dump:tab 0, row 0, @0x1f89tl: 15 fb: --H-FL-- lb: 0x0  cc: 4col  0: [ 2]  c1 02col  1: [ 2]  c1 03col  2: [ 2]  c1 04col  3: [ 2]  c1 05tab 0, row 1, @0x1f7atl: 15 fb: --H-FL-- lb: 0x0  cc: 4col  0: [ 2]  c1 0ccol  1: [ 2]  c1 0dcol  2: [ 2]  c1 0ecol  3: [ 2]  c1 0ftab 0, row 2, @0x1f6btl: 15 fb: --H-FL-- lb: 0x1  cc: 4col  0: [ 2]  c1 16col  1: [ 2]  c1 17col  2: [ 2]  c1 18col  3: [ 2]  c1 19end_of_block_dump

note:顯然列不是基于此列的順序存儲的,也許是 INTCOL#或者SEGCOL# ,對于列值的還原可以參考http://www.anbob.com/archives/1466.html

Summary:對于新特性要了解其原理后再使用,隱藏列控制了select* 和insert values未指定列名時的顯示,對于隱藏列顯示指定列名還是可以顯示,對于列順序錯亂目前保守的做法是可以rename原表,建原表名view 指定列順序或逐次invisible visible,如果自己測試可以嘗試上面我提到的直接update col$.col#列。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人人做人人澡人人爽欧美| 亚洲色图第三页| 国产精品对白刺激| 国产成人精品免费视频| 国产99久久精品一区二区 夜夜躁日日躁| 操91在线视频| 久久亚洲精品小早川怜子66| 91亚洲精华国产精华| 日韩欧美在线国产| 亚洲2020天天堂在线观看| 色综合天天综合网国产成人网| 2023亚洲男人天堂| 欧美在线播放视频| 国产日本欧美一区二区三区在线| 国产成人短视频| 亚洲成人在线视频播放| 日本精品一区二区三区在线| 日韩h在线观看| 色午夜这里只有精品| 国产亚洲视频在线| 91亚洲国产成人久久精品网站| 日韩av不卡电影| 亚洲精品资源美女情侣酒店| 欧美精品在线极品| 91免费在线视频网站| 国产亚洲欧美日韩美女| 亚洲精品在线观看www| 日本精品va在线观看| 亚洲欧洲在线观看| 日韩精品免费综合视频在线播放| 精品福利樱桃av导航| 最近2019免费中文字幕视频三| 在线视频国产日韩| 成人写真视频福利网| 欧美一区二区大胆人体摄影专业网站| 欧美大尺度在线观看| 精品亚洲精品福利线在观看| 国产精品网站入口| 国产一区二区三区直播精品电影| 欧美在线一级视频| 色偷偷av一区二区三区乱| 最近2019中文字幕mv免费看| 亚洲国产高潮在线观看| 日韩黄色高清视频| 日韩欧美一区二区三区久久| 久久久视频免费观看| 国产成人精品电影| 亚洲男人天堂手机在线| 国产精品香蕉在线观看| 中文字幕少妇一区二区三区| 中文日韩在线观看| 91精品国产777在线观看| 成人在线小视频| 性色av香蕉一区二区| 国产成人自拍视频在线观看| 国产精品福利久久久| 亚洲欧美成人精品| 成人黄色免费片| 91手机视频在线观看| 成人激情视频在线播放| 国产亚洲欧美日韩一区二区| 国产69久久精品成人| 久久久亚洲影院你懂的| 懂色av中文一区二区三区天美| 国内精品国产三级国产在线专| 亚洲国产精品悠悠久久琪琪| 国内精品国产三级国产在线专| 久久精品99国产精品酒店日本| 91在线无精精品一区二区| 久久精品国产欧美亚洲人人爽| 日本高清久久天堂| 国产欧美va欧美va香蕉在| 91超碰中文字幕久久精品| 精品视频9999| 91久久综合亚洲鲁鲁五月天| 97久久精品人搡人人玩| 中文欧美日本在线资源| 国产一区二区三区三区在线观看| 国外色69视频在线观看| 国产精品黄色影片导航在线观看| 91九色视频在线| 欧美老妇交乱视频| 色www亚洲国产张柏芝| 亚洲国产成人久久综合一区| 久久色在线播放| 一区二区在线视频| 久久久久久成人| 成人午夜小视频| 亚洲成人久久久久| 国产成人免费av| 欧美最近摘花xxxx摘花| 777777777亚洲妇女| 两个人的视频www国产精品| 亚洲aa中文字幕| 国产精品日韩一区| 亚洲影院高清在线| 国产精品无码专区在线观看| 亚洲高清一区二| 久久久免费高清电视剧观看| 在线国产精品视频| 国产日韩精品电影| 精品国产乱码久久久久久虫虫漫画| 自拍偷拍亚洲精品| 久久久久久久久久久成人| 日韩成人在线观看| 国产噜噜噜噜噜久久久久久久久| 欧美多人乱p欧美4p久久| 一区二区三区久久精品| 国产精品91一区| 奇米一区二区三区四区久久| 亚洲视频axxx| 91香蕉嫩草神马影院在线观看| 欧美日韩裸体免费视频| 亚洲欧洲高清在线| 欧美激情一区二区三区高清视频| 91黑丝高跟在线| 欧美激情精品久久久久久蜜臀| 国产精品v片在线观看不卡| 日韩理论片久久| 国产不卡精品视男人的天堂| 亚洲国产另类 国产精品国产免费| 国产精品一二三在线| 亚洲午夜精品视频| 日韩视频免费在线| 91精品国产高清久久久久久91| 欧美精品videos另类日本| 欧美一区二三区| 国产精品免费一区豆花| 日韩第一页在线| 午夜精品美女自拍福到在线| 国产一区二区三区欧美| 欧美午夜精品久久久久久浪潮| 日韩精品视频免费专区在线播放| 国产精品自产拍在线观看中文| 色偷偷888欧美精品久久久| 午夜精品蜜臀一区二区三区免费| 欧美大片大片在线播放| 国产精品久久久久久久久免费| 亚洲精品久久视频| 成人欧美在线观看| 91久久精品国产91久久性色| 国产精品吹潮在线观看| 国产成人+综合亚洲+天堂| 欧洲精品久久久| 亚洲色图国产精品| 97免费视频在线播放| 国产美女精品视频免费观看| 色久欧美在线视频观看| 69av成年福利视频| 亚洲三级黄色在线观看| 亚洲欧美www| 亚洲欧美中文日韩在线v日本| 亚洲久久久久久久久久久| 成人黄色中文字幕| 亚洲国产91精品在线观看| 亚洲一区二区久久久久久| 亚洲精品乱码久久久久久按摩观| 97视频网站入口| 国产啪精品视频网站| 日韩美女福利视频| 国产日韩亚洲欧美| 亚洲人永久免费| 精品自在线视频| 精品成人国产在线观看男人呻吟|