You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量将Snowflake用户的name字段替换为login_name?

批量修改Snowflake用户名称为Login Name的正确存储过程

你的存储过程存在语法和逻辑问题,以下是修正后的版本及问题说明:

修正后的存储过程

CREATE OR REPLACE PROCEDURE SET_NAME_TO_LOGIN_NAME()
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
  DECLARE
      c1 CURSOR FOR 
          SELECT name, login_name 
          FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) 
          WHERE login_name LIKE '%@EMAIL.COM';
      sql_stmt STRING;
  BEGIN
      -- 执行SHOW USERS获取用户列表
      SHOW USERS;
      
      -- 遍历符合条件的用户
      FOR record IN c1 DO
          -- 构造ALTER语句,用双引号包裹名称避免大小写/特殊字符问题
          sql_stmt := 'ALTER USER "' || record.name || '" RENAME TO "' || record.login_name || '";';
          -- 执行动态SQL
          EXECUTE IMMEDIATE sql_stmt;
      END FOR;
      
      RETURN '批量修改完成,已将符合条件的用户名称更新为对应的login_name';
  END;
  $$;

-- 调用存储过程
CALL SET_NAME_TO_LOGIN_NAME();

原存储过程的问题说明

  • DECLARE块语法错误:show USERS;不能放在变量声明块中,必须放到执行逻辑块(BEGIN内)执行。
  • 游标定义错误:原语句AS NAMES无效,需明确指定需要的字段(name和login_name),这两个字段是构造修改语句的核心。
  • 动态SQL构造错误:
    1. 用户名称和login_name必须用双引号包裹,否则Snowflake可能无法识别带特殊字符或大小写敏感的名称,双引号在字符串中用两个双引号转义。
    2. 引用游标行数据时,应使用record.login_name而非c1.login_name,record才是当前遍历的行对象。
  • 返回值逻辑不合理:原代码返回最后一次循环的SQL语句,改为返回操作完成提示更便于确认结果。

内容的提问来源于stack exchange,提问作者csgarun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:20:27