Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

oracle规避对象名大小写敏感 #1438

Merged
merged 14 commits into from
Apr 26, 2022
Merged
82 changes: 69 additions & 13 deletions sql/engines/oracle.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,9 +340,25 @@ def object_name_check(self, db_name=None, object_name=''):
if '.' in object_name:
schema_name = object_name.split('.')[0]
object_name = object_name.split('.')[1]
sql = f"""SELECT object_name FROM all_objects WHERE OWNER = upper('{schema_name}') and OBJECT_NAME = upper('{object_name}')"""
if '"' in schema_name:
schema_name = schema_name.replace( '"','' )
if '"' in object_name:
object_name = object_name.replace( '"','' )
else:
object_name = object_name.upper()
else:
schema_name = schema_name.upper()
if '"' in object_name:
object_name = object_name.replace( '"','' )
else:
object_name = object_name.upper()
nick2wang marked this conversation as resolved.
Show resolved Hide resolved
else:
sql = f"""SELECT object_name FROM all_objects WHERE OWNER = upper('{db_name}') and OBJECT_NAME = upper('{object_name}')"""
schema_name = db_name
if '"' in object_name:
object_name = object_name.replace( '"','' )
else:
object_name = object_name.upper()
sql = f""" SELECT object_name FROM all_objects WHERE OWNER = '{schema_name}' and OBJECT_NAME = '{object_name}' """
result = self.query(db_name=db_name, sql=sql, close_conn=False)
if result.affected_rows > 0:
return True
Expand Down Expand Up @@ -451,7 +467,7 @@ def explain_check(self, db_name=None, sql='', close_conn=False):
conn = self.get_connection()
cursor = conn.cursor()
if db_name:
cursor.execute(f"ALTER SESSION SET CURRENT_SCHEMA = {db_name}")
cursor.execute(f" ALTER SESSION SET CURRENT_SCHEMA = \"{db_name}\" ")
nick2wang marked this conversation as resolved.
Show resolved Hide resolved
if re.match(r"^explain", sql, re.I):
sql = sql
else:
Expand Down Expand Up @@ -515,7 +531,7 @@ def query(self, db_name=None, sql='', limit_num=0, close_conn=True, **kwargs):
conn = self.get_connection()
cursor = conn.cursor()
if db_name:
cursor.execute(f"ALTER SESSION SET CURRENT_SCHEMA = {db_name}")
cursor.execute(f" ALTER SESSION SET CURRENT_SCHEMA = \"{db_name}\" ")
sql = sql.rstrip(';')
# 支持oralce查询SQL执行计划语句
if re.match(r"^explain", sql, re.I):
Expand Down Expand Up @@ -575,6 +591,7 @@ def execute_check(self, db_name=None, sql='', close_conn=True):
sqlitemList = get_full_sqlitem_list(sql, db_name)
for sqlitem in sqlitemList:
sql_lower = sqlitem.statement.lower().rstrip(';')
sql_nolower = sqlitem.statement.rstrip(';')
# 禁用语句
if re.match(r"^select|^with|^explain", sql_lower):
check_result.is_critical = True
Expand Down Expand Up @@ -642,12 +659,25 @@ def execute_check(self, db_name=None, sql='', close_conn=True):
else:
# 对create table\create index\create unique index语法做对象存在性检测
if re.match(r"^create\s+table|^create\s+index|^create\s+unique\s+index", sql_lower):
object_name = self.get_sql_first_object_name(sql=sql_lower)
object_name = self.get_sql_first_object_name(sql=sql_nolower)
nick2wang marked this conversation as resolved.
Show resolved Hide resolved
# 保存create对象对后续SQL做存在性判断
if '.' in object_name:
object_name = object_name
schema_name = object_name.split('.')[0]
object_name = object_name.split('.')[1]
if '"' in schema_name:
schema_name = schema_name
if '"' not in object_name:
object_name = object_name.upper()
else:
schema_name = schema_name.upper()
if '"' not in object_name:
object_name = object_name.upper()
else:
object_name = f"""{db_name}.{object_name}"""
schema_name = ( '"' + db_name + '"' )
if '"' not in object_name:
object_name = object_name.upper()

object_name = f"""{schema_name}.{object_name}"""
if self.object_name_check(db_name=db_name,
object_name=object_name) or object_name in object_name_list:
check_result.is_critical = True
Expand Down Expand Up @@ -706,11 +736,24 @@ def execute_check(self, db_name=None, sql='', close_conn=True):
else:
# 对alter table做对象存在性检查
if re.match(r"^alter\s+table\s", sql_lower):
object_name = self.get_sql_first_object_name(sql=sql_lower)
object_name = self.get_sql_first_object_name(sql=sql_nolower)
if '.' in object_name:
object_name = object_name
schema_name = object_name.split('.')[0]
object_name = object_name.split('.')[1]
if '"' in schema_name:
schema_name = schema_name
if '"' not in object_name:
object_name = object_name.upper()
else:
schema_name = schema_name.upper()
if '"' not in object_name:
object_name = object_name.upper()
else:
object_name = f"""{db_name}.{object_name}"""
schema_name = ( '"' + db_name + '"' )
if '"' not in object_name:
object_name = object_name.upper()

object_name = f"""{schema_name}.{object_name}"""
if not self.object_name_check(db_name=db_name,
object_name=object_name) and object_name not in object_name_list:
check_result.is_critical = True
Expand All @@ -731,11 +774,24 @@ def execute_check(self, db_name=None, sql='', close_conn=True):
execute_time=0, )
# 对create做对象存在性检查
elif re.match(r"^create", sql_lower):
object_name = self.get_sql_first_object_name(sql=sql_lower)
object_name = self.get_sql_first_object_name(sql=sql_nolower)
if '.' in object_name:
object_name = object_name
schema_name = object_name.split('.')[0]
object_name = object_name.split('.')[1]
if '"' in schema_name:
schema_name = schema_name
if '"' not in object_name:
object_name = object_name.upper()
else:
schema_name = schema_name.upper()
if '"' not in object_name:
object_name = object_name.upper()
else:
object_name = f"""{db_name}.{object_name}"""
schema_name = ( '"' + db_name + '"' )
if '"' not in object_name:
object_name = object_name.upper()

object_name = f"""{schema_name}.{object_name}"""
if self.object_name_check(db_name=db_name,
object_name=object_name) or object_name in object_name_list:
check_result.is_critical = True
Expand Down
2 changes: 1 addition & 1 deletion sql/utils/sql_review.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def is_auto_review(workflow_id):
workflow = SqlWorkflow.objects.get(id=workflow_id)
auto_review_tags = SysConfig().get('auto_review_tag', '').split(',')
# TODO 这里也可以放到engine中实现,但是配置项可能会相对复杂
if workflow.instance.db_type == 'mysql' and workflow.instance.instance_tag.filter(
if ( workflow.instance.db_type == 'mysql' or workflow.instance.db_type == 'oracle' ) and workflow.instance.instance_tag.filter(
peng19832 marked this conversation as resolved.
Show resolved Hide resolved
tag_code__in=auto_review_tags).exists():
# 获取正则表达式
auto_review_regex = SysConfig().get(
Expand Down
2 changes: 1 addition & 1 deletion sql/utils/sql_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ def get_exec_sqlitem_list(reviewResult, db_name):
:return:
"""
list = []
list.append(SqlItem(statement=f"ALTER SESSION SET CURRENT_SCHEMA = {db_name}"))
list.append(SqlItem(statement=f" ALTER SESSION SET CURRENT_SCHEMA = \"{db_name}\" "))

for item in reviewResult:
list.append(SqlItem(statement=item['sql'],
Expand Down