1. 程式人生 > >MySQL使用者許可權導致的建立Trigger失敗

MySQL使用者許可權導致的建立Trigger失敗

說來慚愧,MySQL一直處於只會用,不怎麼理解的階段。甚至是一些較為深層次的管理,都不怎麼熟悉,得加強啊!

近日,系統測試,使用MySQL資料庫,需要在某個表上建立觸發器,資料庫是在本機安裝。但是,無論如何都無法建立觸發器,後臺錯誤資訊如下:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: TRIGGER command denied to user 'root'@'mortimer-PC' for table 't_user'
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2627)
	at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:841)
	at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:681)
	at com.apusic.jdbc.adapter.StatementHandle.execute(Unknown Source)
	at com.apusic.esb.base.util.SQLUtil.createDBObjectIfNecessary(SQLUtil.java:263)
	at com.apusic.esb.base.util.SQLUtil.createDBObjectIfNecessary(SQLUtil.java:225)
	at com.apusic.esb.config.trigger.mysql.MySqlTriggerManager.createTriggersIfNecessary(MySqlTriggerManager.java:83)
	at com.apusic.esb.config.trigger.TriggerConfigManager.deploy(TriggerConfigManager.java:331)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.apusic.esb.base.communication.CommInvokeUtil.invoke(CommInvokeUtil.java:139)
	at com.apusic.esb.base.communication.CommInvokeUtil.invoke(CommInvokeUtil.java:43)
	at com.apusic.esb.base.communication.CommInvokeUtil.invoke(CommInvokeUtil.java:27)
	at com.apusic.esb.base.communication.socket.server.CommSocketServer$RequestProcessor.run(CommSocketServer.java:99)
	at com.apusic.util.ThreadPoolImpl$WorkerThread.run(Unknown Source)
2014-06-25 10:38:42 錯誤 [apusic.com.apusic.esb.config.trigger.TriggerConfigManager] 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: TRIGGER command denied to user 'root'@'mortimer-PC' for table 't_user'
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2627)
	at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:841)
	at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:681)
	at com.apusic.jdbc.adapter.StatementHandle.execute(Unknown Source)
	at com.apusic.esb.base.util.SQLUtil.createDBObjectIfNecessary(SQLUtil.java:263)
	at com.apusic.esb.base.util.SQLUtil.createDBObjectIfNecessary(SQLUtil.java:225)
	at com.apusic.esb.config.trigger.mysql.MySqlTriggerManager.createTriggersIfNecessary(MySqlTriggerManager.java:83)
	at com.apusic.esb.config.trigger.TriggerConfigManager.deploy(TriggerConfigManager.java:331)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.apusic.esb.base.communication.CommInvokeUtil.invoke(CommInvokeUtil.java:139)
	at com.apusic.esb.base.communication.CommInvokeUtil.invoke(CommInvokeUtil.java:43)
	at com.apusic.esb.base.communication.CommInvokeUtil.invoke(CommInvokeUtil.java:27)
	at com.apusic.esb.base.communication.socket.server.CommSocketServer$RequestProcessor.run(CommSocketServer.java:99)
	at com.apusic.util.ThreadPoolImpl$WorkerThread.run(Unknown Source)
分析錯誤資訊:TRIGGER command denied to user 'root'@'mortimer-PC' for table 't_user',看起來是不允許root使用者在t_user表上執行TRIGGER命令,為啥不允許?
分析下,首先懷疑是否驅動的問題,因為,驅動確實存在不匹配的問題,驅動的版本較低(針對5.0),而伺服器版本為5.5,替換驅動之後問題依舊。

其次,分析錯誤資訊本身,不允許執行神馬命令,看起來貌似是許可權問題,Navicat連線資料庫,檢視使用者許可權,發現使用者“[email protected]%”的“Trigger”一欄未選中!而此次連線的使用者,看起來是“

[email protected]”,因此,“[email protected]”的規則,貌似不會生效,估計是此原因,造成無法建立觸發器。

調整“[email protected]%”使用者的許可權,選中“Trigger”欄,重啟MySQL服務,重新連線MySQL,建立觸發器,OK!