用select查死数据库

yeisou 发布于 2011/09/27 10:33
阅读 1K+
收藏 0
SQL

项目有一个需求,就是要求在界面上可以写SQL,去访问别的数据库,然后将查询到的数据导入到本地数据库上,当然权限会限制为SELECT

但个人还是感觉很危险,这样同等于把数据库暴露出来,

可是又举不出例子,大侠们能不能提供点例子?

加载中
0
彭龙
彭龙
phpmyadmin
0
小囧
小囧
诶 感兴趣的飘过~
0
mark35
mark35
使用视图
0
老腊肉
无为
无为
这个一般的数据库是不会给的。太危险了!!!尤其是经过外网的!!!
0
yeisou
yeisou
还是没答案。。
0
鸵鸟
鸵鸟
针对“输入SQL,执行查询,导出结果”这个业务需求,数据库应该被视为Domain Object,而不是传统意义上的Repository。
0
罪恶的花生
罪恶的花生

暴露谁的,你的,还是对方的,如果是对方的,没有知道对方数据连接方法的话,用什么来连接。担心是多余的。

至于select后存入本地数据,只要数据规范符合本地数据库标准给事,可以直接生成INSERT方法本地数据库执行

 

stmt = con.createStatement();
System.out.println(SQL);
rs = stmt.executeQuery(SQL);
ResultSetMetaData rowcol = rs.getMetaData();
int rowi = rowcol.getColumnCount();
int rownum = 0;
while (rs.next()) {
	List<Object> lists = new ArrayList<Object>();
	String Keyworkd = "";
	String Values = "";
	try{
	for (int j = 1; j <= rowi; j++) {
		try{
			lists.add(rs.getObject(j));
			Keyworkd +=rowcol.getColumnName(j)+"";
			Values += "?";
			if(j!=rowi){
				Keyworkd+=",";
				Values+=",";
			}
		}catch(Exception e){System.out.println(e);}
	}
	if(rownum==1||rownum==100||rownum==200||rownum==300||rownum==400){
		System.out.println("");
	}
	if(rownum==500){
		rownum=0;
		System.out.print(rowcount+",");
		mssqlcon.commit();
	}else{
		System.out.print(rowcount+",");
	}
	rownum++;
	INSERTSQL = "INSERT INTO  \"TestTable\" ("+Keyworkd+")VALUES("+Values+")";
	INSERTSQL = StringUtils.replace(INSERTSQL, "'1000-", "'1900-");
//	System.out.println(INSERTSQL);
	Object[] params = new Object[lists.size()];
	int i=0;
	for (Object obj : lists) {
		params[i]=obj;
		i++;
	}
	qr.update(mssqlcon, INSERTSQL, params);
	rowcount++;
	}catch (Exception e) {
		System.out.println("\nErrMessage = "+e.getMessage()+"\n");
		e.printStackTrace();
	}
}

罪恶的花生
罪恶的花生
List转Object[] 早期都是自己写的方法,现在可以直接使用params.toArray()
0
简单代码
简单代码
开发自定义查询咯,这种模式风险非常大,一般没有这样开放数据库的。
0
钛元素
钛元素

1使用视图

2只允许查询部分视图

3屏蔽某些语句

0
VincentTone
VincentTone
还是要过滤才好,select是貌似是可以提权的。
返回顶部
顶部