学习达梦hint注入笔记
1.创建表
drop table test;
SQL> create table test(id int,info varchar);
操作已执行
SQL> insert into test select level,'a' from dual connect by level <=10000;
影响行数 10000
SQL> create index idx_test_id on test(id);
操作已执行
SQL> stat 100 on test(id);
操作已执行
SQL> explain select * from test where id>1; --正常是走全表扫描
1 #NSET2: [1, 9999, 60]
2 #PRJT2: [1, 9999, 60]; exp_num(3), is_atom(FALSE)
3 #SLCT2: [1, 9999, 60]; TEST.ID > 1
4 #CSCN2: [1, 10000, 60]; INDEX33555470(TEST)
SQL> sp_set_para_value(1,'ENABLE_INJECT_HINT',1); --开启ENABLE_INJECT_HINT参数
DMSQL 过程已成功完成
编辑hint注入
SQL> SF_INJECT_HINT('select * from test where id>1;','INDEX(TEST,IDX_TEST_ID)','INJECT1','test injecting hint', TRUE,TRUE);指定该语句使用IDX_TEST_ID索引
DMSQL 过程已成功完成
SQL> explain select * from test where id>1; --再次查询走了索引
1 #NSET2: [10, 9999, 60]
2 #PRJT2: [10, 9999, 60]; exp_num(3), is_atom(FALSE)
3 #BLKUP2: [10, 9999, 60]; IDX_TEST_ID(TEST)
4 #SSEK2: [10, 9999, 60]; scan_type(ASC), IDX_TEST_ID(TEST), scan_range(1,max]
SELECT * from SYSINJECTHINT; ---查询hint注入
SF_DEINJECT_HINT('INJECT1'); ----删除hint 注入
应用中很多条件类型是?,这种也可以进行hint注入
SQL> SF_INJECT_HINT('* from test where id>?;','INDEX(TEST,IDX_TEST_ID)','INJECT2','test injecting hint', TRUE,TRUE);指定该语句使用IDX_TEST_ID索引
DMSQL 过程已成功完成