学习达梦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 过程已成功完成

 

posted @ 2024-08-20 16:13  xuchuangye  阅读(83)  评论(1编辑  收藏  举报