如何在Azure Function的Python代码中获取SQL Server的SYSTEM_USER?
问题解决方案
1. 修复Python代码获取SYSTEM_USER返回None的问题
你的exec_sql_query_no_params函数仅执行了查询,但未获取查询结果,因此返回None。需要在执行cursor.execute(query)后添加结果获取逻辑:
修改后的代码示例:
sql_fetch_system_user = "SELECT SYSTEM_USER;" system_user = exec_sql_query_no_params(sql_fetch_system_user, sql_server, database, sql_user_name, sql_password, sql_driver) print("SYSTEM_USER:", system_user) def exec_sql_query_no_params(query, sql_server, database, sql_user_name, sql_password, sql_driver): try: with pyodbc.connect('DRIVER='+sql_driver+';SERVER=tcp:'+sql_server+';PORT=1433;DATABASE='+database+';UID='+sql_user_name+';PWD=' + sql_password) as conn: with conn.cursor() as cursor: conn.autocommit = True cursor.execute(query) # 获取单行查询结果,返回SYSTEM_USER的具体值 result = cursor.fetchone() return result[0] if result else None except pyodbc.Error as e: logging.error(f"SQL query failed: {e}") raise
关键修改点:
- 执行查询后调用
cursor.fetchone()获取单行结果 - 返回结果元组的第一个元素(即
SYSTEM_USER的实际取值)
2. sql_user_name与SYSTEM_USER的关系
两者在当前SQL认证场景下通常一致,但并非绝对等价:
- 当使用SQL Server账号认证(即代码中
UID=sql_user_name;PWD=sql_password的连接方式),SYSTEM_USER会返回当前登录的SQL账号名,也就是你传入的sql_user_name。 - 如果切换为Windows认证(比如连接字符串使用
Trusted_Connection=YES),SYSTEM_USER会返回Windows登录用户名(格式如DOMAIN\Username),此时若sql_user_name是手动传入的Windows账号名则可能一致,但通过托管身份等方式连接时,两者可能存在差异。
额外优化建议
如果需求是给Added_by列赋值当前数据库登录用户,更高效的方式是直接在插入SQL中使用SYSTEM_USER,无需提前查询:
INSERT INTO YourTable (Column1, Added_by) VALUES (?, SYSTEM_USER);
这样既减少了一次SQL查询,也避免了客户端与服务器端的用户一致性问题。
内容的提问来源于stack exchange,提问作者heman123
相关产品推荐
相关产品推荐

