Mysql

通過 information_schema 更新 mysql 觸發器——訪問被拒絕?

  • October 2, 2014

對於 MySQL(實際上是 MariaDB)中的某些觸發器,我有一些錯誤的“定義器”。我認為糾正它們的最簡單方法是以下版本:

use information_schema;
update triggers set definer=current_user() where trigger_schema='foobar';

它產生:

ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'

在同一個會話中,我可以使用“drop trigger”和“create trigger”來刪除和重新創建觸發器,所以我不理解權限問題。我的使用者是否需要一些它沒有的特權?

您正在做的事情是不可能的,因為 INFORMATION_SCHEMA 數據庫是由記憶體中只讀臨時表組成的數據庫(請參閱我的文章如何在 MySQL 中實現 INFORMATION_SCHEMA?

您將不得不刪除觸發器並重新創建它們

我之前寫過一個文章(Oct 02, 2011mysqldump可以轉儲觸發器和程序嗎?

這是您可以對foo數據庫中的所有觸發器執行的操作

STEP 01 : mysqldump 觸發器

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump -${MYSQL_CONN} -d -t --skip-routines --triggers foo > foo_make_triggers.sql

為了澄清

STEP 02 : 創建一個腳本來刪除所有觸發器

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('DROP TRIGGER ',trigger_name,';')"
SQL="${SQL} FROM information_schema.triggers"
SQL="${SQL} WHERE trigger_schema = 'foo'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > foo_drop_triggers.sql

STEP 03 : 驗證每個文件的內容

vi -R foo_drop_triggers.sql
vi -R foo_make_triggers.sql

STEP 04 : 編輯所有foo_make_triggers.sql你知道的定義器

步驟 05:登錄 mysql 並執行它

use foo
source foo_drop_triggers.sql
source foo_make_triggers.sql

請在登台伺服器上進行測試

試一試 !!!

引用自:https://dba.stackexchange.com/questions/78268