alter session set current_schema=Schema

本文深入探讨了Oracle环境中USER与SCHEMA的概念,并通过实例展示了如何利用ALTERT_SESSION来切换当前会话所参考的默认SCHEMA,以及与SYNONYMS的关系。重点阐述了如何在不改变代码的情况下访问其他SCHEMA的对象,以及在不同用户间共享资源的方法。

使用CURRENT_SCHEMA之后,当前会话所参考的默认SCHEMA变为设置的用户,而不再是当前的用户;




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


TEST.T1 ,TEST下面有表T1,SCOTT需要访问它
SQL>CONNECT TEST/TEST
SQL>GRANT SELECT ON T1 TO SCOTT;
SQL>CONNECT scott/tiger
SQL>SELECT * FROM SCOTT.T1;
SQL>ALTER SESSION SET CURRENT_SCHEMA = test;
SQL>SELECT * FROM T1;

ALTER SESSION SET CURRENT_SCHEMA = test之后,区别仅在于SCOTT用户访问TEST用户下面的表不需要带上SCHEMA而已,注意的是,SELECT 查询权限还是需要首先赋予的。

转载于:https://www.cnblogs.com/JSD1207ZX/p/9386303.html

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
服务端传给客户端 一个聊天私聊群聊类型数据ConcurrentHashMap 一个聊天消息类型数据ConcurrentHashMap ConcurrentHashMap<Long, List<ChatMessage>> messageMap = new ConcurrentHashMap<>(); ConcurrentHashMap<Long, List<GroupMessage>> groupMessageMap = new ConcurrentHashMap<>(); 查询聊天私聊群聊类型组件 先查私聊有没有头像 用户名 还要置顶 SELECT m.user_id, m.isPinned, u.username, u.image FROM friend m JOIN user u ON m.user_id = u.id " WHERE m.friend_id = ? 再差私聊有没有最后消息 最后活动时间 未读消息 SELECT CASE WHEN sender_id = ? THEN receiver_id ELSE sender_id END as chat_id, MAX(time) as last_time, (SELECT content FROM messages m WHERE (m.sender_id = ? OR m.receiver_id = ?) AND (CASE WHEN m.sender_id = ? THEN m.receiver_id ELSE m.sender_id END) = chat_id AND m.room_id IS NULL ORDER BY m.time DESC LIMIT 1) as last_message, SUM(CASE WHEN receiver_id = ? AND status = 0 THEN 1 ELSE 0 END) as unread_count FROM messages WHERE (sender_id = ? OR receiver_id = ?) AND room_id IS NULL GROUP BY chat_id ORDER BY last_time DESC; 这是用来全部查询好友消息的操作 SELECT g.id AS group_id, g.name AS group_name, g.image AS group_avatar, MAX(ug.timeship) AS last_active_time, (SELECT ug2.message FROM user_group ug2 WHERE ug2.group_id = g.id ORDER BY ug2.timeship DESC LIMIT 1) AS last_message, SUM(CASE WHEN ug.status = 1 AND ug.user_id != ? THEN 1 ELSE 0 END) AS unread_count, MAX(ug.isPinned) AS is_pinned FROM groupsql g JOIN user_group ug ON g.id = ug.group_id WHERE ug.user_id = ? OR EXISTS (SELECT 1 FROM user_group WHERE group_id = g.id AND user_id = ?) GROUP BY g.id, g.name, g.image ORDER BY is_pinned DESC, last_active_time DESC; 你替我完善一下,我要发博客
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值