【发布时间】:2017-05-16 10:40:59
【问题描述】:
如何使用 MySQL 更改过程中的定义器和触发器?
UPDATE `mysql`.`trig` p
SET definer = 'user@%'
WHERE definer='root@%'`
【问题讨论】:
-
你查过alter table的语法吗?您可能必须删除并重新添加触发器。
标签: mysql
如何使用 MySQL 更改过程中的定义器和触发器?
UPDATE `mysql`.`trig` p
SET definer = 'user@%'
WHERE definer='root@%'`
【问题讨论】:
标签: mysql
对于触发器和视图,您可以使用它,正如我所描述的 here。对于过程,同样的事情应该适用于表 information_schema.routines。
原帖: 我知道这是一个旧帖子,但也许它可以帮助某人。
我使用这个 sql 查询来生成一个 DROP 和一个 CREATE 命令:
SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "yourdatabase";
当我将生产数据库带到我的开发机器并使用 foreach 处理所有命令并自动重新创建触发器时,我在我的应用程序中使用它。这让我可以选择自动化它。
PHP/Laravel 中的示例:
$this->info('DROP and CREATE TRIGGERS');
$pdo = DB::connection()->getPdo();
$sql = 'SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "mydatabase";';
$stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach($result as $rs){
$pdo = DB::unprepared($rs['sqlCommand']);
break;
}
提示:由于mysql缓冲区查询问题,我必须用pdo来做,描述here
我的观点也是如此(在这里你可以使用 ALTER TABLE):
$pdo = DB::connection()->getPdo();
$sql = 'SELECT CONCAT("ALTER DEFINER=`homestead` VIEW ", table_name," AS ", view_definition,";") AS sqlCommand FROM information_schema.views WHERE table_schema="mydatabase";';
$stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->info('View definer changed');
foreach($result as $rs){
$pdo = DB::unprepared($rs['sqlCommand']);
}
希望对你有帮助。
【讨论】: