mysql如何查看已创建的函数与触发器_mysql show create function

7次阅读

mysql如何查看已创建的函数与触发器_mysql show create function

怎么查 mysql 里所有已创建的函数

直接查 information_schema.ROUTINES 表最可靠,SHOW function STATUS 虽快但权限要求高、且不返回函数体。

常见错误是只用 SHOW CREATE FUNCTION func_name —— 这必须知道函数名才能查,没法枚举全部。

  • select ROUTINE_NAME, ROUTINE_DEFINITION FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'your_db' AND ROUTINE_TYPE = 'FUNCTION'
  • 注意 ROUTINE_DEFINITION 在某些配置下可能为 NULL(比如开启了 log_bin_trust_function_creators=OFF 且函数未被标记为 DETERMINISTIC
  • 如果只想要函数名列表,去掉 ROUTINE_DEFINITION 即可,避免大字段拖慢查询

如何查看某个函数的具体定义(含参数和逻辑)

SHOW CREATE FUNCTION 是唯一能拿到完整 CREATE FUNCTION 语句的方式,包括参数类型、返回值、特性声明(如 DETERMINISTIC)和函数体。

容易踩的坑:函数名必须严格匹配大小写(取决于系统变量 lower_case_table_names),且不能加数据库前缀——SHOW CREATE FUNCTION mydb.myfunc 会报错,得先 USE mydb 或用 myfunc 单独写。

  • 执行前确认当前用户有 SELECT 权限在 mysql.proc(旧版)或 information_schema.ROUTINES(新版),否则提示 access denied
  • 若返回 NULLCreate Function 列,大概率是函数定义被隐藏了(常见于二进制日志安全限制)
  • 示例:SHOW CREATE FUNCTION calc_tax → 返回一行,第二列就是完整的创建语句

触发器怎么列出来,和函数查法一样吗

不一样。触发器不存于 ROUTINES,得查 information_schema.TRIGGERS,而且 SHOW TRIGGERS 更常用、更直观。

SHOW TRIGGERS 默认只显示当前库的触发器,加 FROM other_db 可切换;但它不返回触发器逻辑,要定义得用 SHOW CREATE TRIGGER

  • SHOW TRIGGERS LIKE 'order_%' 支持简单模糊匹配,比查表方便
  • SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_db' 更适合脚本化处理
  • 触发器没有“跨库调用”概念,所以 TRIGGER_SCHEMA 永远等于它所属的数据库名,别指望从其他库查到

为什么 SHOW CREATE FUNCTION 有时报错 Unknown function

不是函数不存在,而是当前用户没权限读取函数元数据,或者函数根本不在当前默认库中。

典型错误信息是:Error 1418 (HY000): this function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary Logging is enabled —— 这其实是创建时的限制,但会影响后续 SHOW CREATE 的可见性。

  • 检查是否执行过 SELECT * FROM mysql.proc WHERE name = 'func_name'(需 PROCESS 权限)
  • 确认函数确实在当前连接的默认数据库里,否则显式指定:SHOW CREATE FUNCTION your_db.func_name(注意:这个语法仅在 MySQL 8.0.23+ 支持)
  • 低版本 MySQL 中,跨库查函数定义只能先 USE your_db,再执行 SHOW CREATE FUNCTION

函数体是否可见、触发器能否跨库查、权限和版本对命令行为的影响——这些细节不试一次根本意识不到。

text=ZqhQzanResources