保留存储过程与函数导出、权限检查、编码处理、共享存储对象逻辑及正式测试,同步两份任务进度文档。 已知阻塞:已有MySQL 5.7实库记录中,两种恢复入口均存在Latin-1例程注释乱码;已有8.0编码与权限专项通过,但不能代替最终双版本全量复测。本次仅重新运行例程单元测试及相关包静态检查,均通过。 这是未完成整改的保存检查点,不是发布版本,不表示P0-05完成或生产验收通过。未纳入运行数据、构建产物、原始实库日志或凭据。
62 lines
2.2 KiB
Go
62 lines
2.2 KiB
Go
package cli
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"fmt"
|
||
"io"
|
||
)
|
||
|
||
func dumpMySQLTriggers(ctx context.Context, tx *sql.Tx, output io.Writer) error {
|
||
// 名称排序不能代表执行顺序;同一表、时机和事件按服务器的 ACTION_ORDER 导出。
|
||
rows, err := tx.QueryContext(ctx, `SELECT TRIGGER_NAME FROM information_schema.TRIGGERS
|
||
WHERE TRIGGER_SCHEMA = DATABASE()
|
||
ORDER BY EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION, ACTION_ORDER`)
|
||
if err != nil {
|
||
return fmt.Errorf("读取 MySQL 触发器列表失败:%w", err)
|
||
}
|
||
var names []string
|
||
for rows.Next() {
|
||
var name string
|
||
if err := rows.Scan(&name); err != nil {
|
||
_ = rows.Close()
|
||
return fmt.Errorf("读取 MySQL 触发器名称失败:%w", err)
|
||
}
|
||
names = append(names, name)
|
||
}
|
||
if err := rows.Err(); err != nil {
|
||
_ = rows.Close()
|
||
return fmt.Errorf("遍历 MySQL 触发器失败:%w", err)
|
||
}
|
||
if err := rows.Close(); err != nil {
|
||
return err
|
||
}
|
||
if len(names) == 0 {
|
||
return nil
|
||
}
|
||
var databaseCollation string
|
||
if err := tx.QueryRowContext(ctx, "SELECT @@collation_database").Scan(&databaseCollation); err != nil {
|
||
return fmt.Errorf("读取 MySQL 数据库排序规则失败:%w", err)
|
||
}
|
||
if _, err := fmt.Fprintln(output, `SET @scert_trigger_sql_mode = @@SESSION.sql_mode;
|
||
SET @scert_trigger_charset = @@SESSION.character_set_client;
|
||
SET @scert_trigger_collation = @@SESSION.collation_connection;`); err != nil {
|
||
return err
|
||
}
|
||
for _, name := range names {
|
||
definition, err := readMySQLTrigger(ctx, tx, name)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if err := writeMySQLStoredDefinition(ctx, tx, output, definition, "SQL Original Statement", ""); err != nil {
|
||
return fmt.Errorf("写入 MySQL 触发器失败(%s):%w", name, err)
|
||
}
|
||
}
|
||
_, err = fmt.Fprintf(output, "ALTER DATABASE COLLATE %s;\nSET SESSION sql_mode = @scert_trigger_sql_mode;\nSET SESSION character_set_client = @scert_trigger_charset;\nSET SESSION collation_connection = @scert_trigger_collation;\n\n", quoteMySQLIdentifier(databaseCollation))
|
||
return err
|
||
}
|
||
|
||
func readMySQLTrigger(ctx context.Context, tx *sql.Tx, name string) (map[string]string, error) {
|
||
return readMySQLStoredDefinition(ctx, tx, "TRIGGER", name, "SQL Original Statement")
|
||
}
|