us_ateneo 2024-06-25 13:24 采纳率: 0%
浏览 7

如果你帮我解答 我可以付款,mysql 触发器

#mysql 数据库开发自动化脚本
我现在有 50 dbname,我想在每个数据库都要创建 一个触发器 对某几个特殊表
但是目前 我在开发过程中 遇到了一个 mysql 不支持的语法 怎么解决,感谢

DELIMITER //
CREATE PROCEDURE prc_ctl_tables(IN tablename VARCHAR(255))
 BEGIN
  declare v_table_name varchar(100);
  declare v_db_name varchar(100);
  declare EmptyData int default 0;
  declare v_cnt int default 0;
  declare v_done int default 0;
  declare v_i int default 0;
  declare tab_name varchar(200) default '';
    declare tab_name_1 varchar(200) default '';
  declare v_message varchar(200);
  declare v_cursor cursor for (select distinct table_name,table_schema from information_schema.columns where table_name = tablename );
  declare CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
  open v_cursor;
  # 循环
  repeat
  # 获取游标中值并赋值给变量
       fetch v_cursor into v_table_name,v_db_name;
       # 判断游标是否到底,若到底则退出游标
       # 需要注意这个判断
        if v_db_name is not null  and  not v_done then
          #set tab_name = concat('create table  v_newtable',' as select * from `tg_table` where 1=2;');
          
          set tab_name_1 = concat( 'use ', v_db_name,';');
          #set tab_name_1 = concat('select * from tg_table;');
          SET @SQL_1 = concat(tab_name_1);
          select @SQL_1;
          prepare  schema_stmt_1 from @SQL_1;
          EXECUTE schema_stmt_1;
          deallocate prepare schema_stmt_1;
          
          #set tab_name = concat('insert into ',v_db_name,'.','tg_table select', ' 444',',',' 444',',',' 444',';');
          set tab_name = concat('select * from',v_db_name,'.',tg_table,';');
          SET @SQL = CONCAT(tab_name);
          select @SQL;
          prepare  schema_stmt from @sql;
          EXECUTE schema_stmt;
          deallocate prepare schema_stmt; 
       end if;
       until v_done end REPEAT;
       fetch v_cursor into v_table_name,v_db_name;
       if v_db_name is null then
           set v_message=concat('not exists table  ',':',tablename);
           select v_message;
      end if;
  close v_cursor;
 END//
DELIMITER ;


/* 主要问题是在这里 不支持我这个语句命令,因为我要创建触发器,必须要在dbname 下才能执行 set tab_name_1 = concat( 'use ', v_db_name,';');*/ 

感谢帮我看看怎么做 感谢

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-25 13:37
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您好!看起来您正在尝试使用存储过程来动态地为不同的数据库创建触发器。在MySQL中,USE语句不能在PREPARE语句中使用,因为PREPARE语句主要用于执行SQL语句,而USE语句实际上是改变当前会话的默认数据库,这个操作不是通过执行SQL语句来完成的。

    要解决这个问题,您可以使用动态SQL来直接在目标数据库中创建触发器,而不需要显式地使用USE语句。以下是一个示例,展示了如何在不同的数据库中创建触发器,而不需要使用USE语句:

    DELIMITER //
    
    CREATE PROCEDURE prc_create_trigger(IN dbname VARCHAR(255), IN tablename VARCHAR(255))
    BEGIN
      -- 动态创建触发器的SQL语句
      SET @trigger_sql = CONCAT('CREATE TRIGGER trigger_name BEFORE INSERT ON ', dbname, '.', tablename, ' FOR EACH ROW BEGIN SET NEW.some_column = ...; END;');
    
      -- 执行动态SQL
      PREPARE stmt FROM @trigger_sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END //
    
    DELIMITER ;
    

    在这个示例中,trigger_nameBEFORE INSERTNEW.some_column...需要根据您的具体需求进行替换。这个存储过程接受数据库名dbname和表名tablename作为参数,并为指定的表在指定的数据库中创建一个触发器。

    请注意,您需要确保您的MySQL用户有足够的权限来在不同的数据库上执行这些操作。

    如果您需要进一步的帮助或者有其他问题,请随时告诉我。祝您开发顺利!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月25日