[oracle]alter session set current_schema=schema

本文详细解释了Oracle数据库中用户(user)与模式(schema)的区别,通过生动的比喻帮助理解两者的概念及其相互关系,并介绍了如何使用altersession指令来切换模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

alter session set current_schema=schema

 

user即oracle中的用户,和所有系统的中用户概念类似,用户所持有的是系统的权限及资源;而schema所涵盖的是各种对象,它包含了表、函数、 包等等对象的“所在地”,并不包括对他们的权限控制。好比一个房子,里面放满了家具,对这些家具有支配权的是房子的主人(user),而不是房子 (schema)。你可以也是一个房子的主人(user),拥有自己的房子(schema)。可以通过alter session的方式进入别人的房子。这个时候,你可以看到别人房子里的家具(desc)。如果你没有特别指定的话,你所做的操作都是针对你当前所在房子 中的东西。至于你是否有权限使用(select)、搬动(update)或者拿走(delete)这些家具就看这个房子的主人有没有给你这样的权限了,或 者你是真个大厦(DB)的老大(DBA)。
alter session set schema可以用来代替synonyms。如果你想调用其他schema的对象(有权限的前提下),又没建synonym,有不想把其他schema名 字放如代码中,就可以先alter session set schema=<其他schema名字>。

import cx_Oracle import os import re def execute_index_statements(sql_file_path, error_file_path, db_username, db_password, db_dsn, max_retries=5): """ 循环执行SQL文件中的CREATE INDEX语句,直到所有错误都是"索引已存在"或达到最大重试次数 :param sql_file_path: 包含CREATE INDEX语句的SQL文件路径 :param error_file_path: 错误SQL语句的输出文件路径 :param db_username: 数据库用户名 :param db_password: 数据库密码 :param db_dsn: 数据库DSN连接字符串 :param max_retries: 最大重试次数 """ # 读取SQL文件并分割语句 with open(sql_file_path, 'r') as sql_file: sql_content = sql_file.read() # 分割SQL语句,保留分号 statements = [stmt.strip() + ";" for stmt in sql_content.split(';') if stmt.strip()] # 连接到Oracle数据库 try: connection = cx_Oracle.connect(user=db_username, password=db_password, dsn=db_dsn) cursor = connection.cursor() # 设置当前模式为GHANA_CASH try: cursor.execute("ALTER SESSION SET CURRENT_SCHEMA = GHANA_CASH") print("✓ 当前模式已设置为: GHANA_CASH") except cx_Oracle.DatabaseError as e: print(f"⚠️ 无法设置当前模式: {e}") print("请确保用户有权设置当前模式,或模式名称正确") # 继续执行,但索引可能无法在正确的模式下创建 # 初始化变量 all_errors = [] retry_count = 0 has_non_index_errors = True # 循环执行直到只有"索引已存在"错误或达到最大重试次数 while has_non_index_errors and retry_count <= max_retries: current_errors = [] has_non_index_errors = False print(f"\n{'=' * 50}") print(f"执行轮次 #{retry_count + 1} (共 {len(statements)} 条语句)") for stmt in statements: try: # 移除语句末尾的分号 executable_stmt = stmt.rstrip(';') cursor.execute(executable_stmt) # 提取索引名用于输出 index_name = extract_index_name(stmt) print(f"✓ 成功创建索引: {index_name}") except cx_Oracle.DatabaseError as e: error_obj, = e.args error_code = error_obj.code # 检查是否"此列列表已索引" if error_code == 1408: # ORA-01408: such column list already indexed index_name = extract_index_name(stmt) print(f"⚠️ 列列表已索引: {index_name} (ORA-01408)") else: # 记录其他错误 error_msg = f"错误语句: {stmt}\n错误代码: ORA-{error_code}\n错误信息: {error_obj.message}\n" print(error_msg) current_errors.append(stmt) all_errors.append((stmt, error_code, error_obj.message)) has_non_index_errors = True # 准备下一轮执行的语句 statements = current_errors retry_count += 1 # 写入错误文件 if all_errors: with open(error_file_path, 'w') as error_file: error_file.write("-- 以下语句在多次重试后仍执行失败:\n\n") for stmt, error_code, error_msg in all_errors: error_file.write(f"-- ORA-{error_code}: {error_msg}\n") error_file.write(f"{stmt}\n\n") print(f"\n执行完成!仍有 {len(all_errors)} 条语句失败") print(f"错误语句已保存至: {os.path.abspath(error_file_path)}") else: print("\n🎉 所有语句执行成功!无错误语句") except cx_Oracle.DatabaseError as e: print(f"数据库连接失败: {e}") finally: if 'cursor' in locals(): cursor.close() if 'connection' in locals(): connection.close() def extract_index_name(sql_statement): """从CREATE INDEX语句中提取索引名""" # 使用正则表达式匹配索引名 match = re.search(r'CREATE\s+(?:UNIQUE\s+)?INDEX\s+(\w+)\s+ON', sql_statement, re.IGNORECASE) if match: return match.group(1) return "未知索引" # 配置参数 config = { "sql_file_path": "C:\\Users\\Administrator\\PycharmProjects\\pythonProject\\oracle_comments_ghana_cash.sql", # 输入SQL文件 "error_file_path": "C:\\Users\\Administrator\\PycharmProjects\\pythonProject\\failed_indexes.sql", # 错误SQL输出文件 "db_username": "YTF", # 替换为实际用户名 "db_password": "YTF_123456", # 替换为实际密码 "db_dsn": "oracle-1.cfjq6sky0wee.ap-south-1.rds.amazonaws.com:1521/ORCL", # 替换为实际DSN "max_retries": 5 # 最大重试次数 } # 执行函数 execute_index_statements(**config)增加连接重试机制
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值