My Photo

February 14, 2015

MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編)

関連記事:
MySQLメモ013:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法

大分前にJava+MySQLでAUTO_INCREMENTな列の値をINSERT後に取得する方法について記事を書いた。
今、仕事はPHPばかりなので、PHPでのやり方についてメモ。

列idがPKでAUTO_INCREMENTだとして、以下のようなidの指定を省略したINSERT文を実行する。

INSERT INTO test_tbl_01 (name) VALUES ('テスト名前')

これにより作成されたレコードのidを取得する。
最初はINSERTの直後に LAST_INSERT_ID() を使って

SELECT LAST_INSERT_ID() AS last_id

を実行していた。しかし、やりたいのはINSERTだけなのにSQLを2回発行するのは面倒くさい。
他の方法がないか調べるとPDOクラスの lastInsertId() というメソッドがを見つけた。
サンプルコードは以下。Windows7+Apache2.2+PHP5.3.29で動作を確認した。

$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8';
$username = 'username';
$password = 'password';

// PHP5.3.6より前
//$options = array(
//	PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
//); 

try {
	$db = new PDO($dsn, $username, $password);
//	$db = new PDO($dsn, $username, $password, $options);	// PHP5.3.6より前
	
//	$db->beginTransaction();	// トランザクション開始
	
	$sql = 'INSERT INTO test_tbl_01 (name) VALUES (?)';
	$stmt = $db->prepare($sql);
	
	$stmt->execute(array('テスト氏名'));
	
	$last_id = $db->lastInsertId();
	print("id={$last_id}\n");
	
//	$db->commit();	// トランザクション終了
	
} catch (PDOException $e) {
	exit('DBエラー:' . $e->getMessage());
}

トランザクション内で使わなければならないということを書いてあるサイトもあったが、オートコミットモードでも問題なく使用できた。

参考ページ:
PHP: PDO_MYSQL DSN - Manual
PHPでPDOを使ってMySQLに接続、INSERT、UPDATE、DELETE、COUNT、SUM - Qiita
select last_insert_id() - MySQL初心者日記 - MySQLグループ
PHP: PDO::lastInsertId - Manual
select last_insert_id() - MySQL初心者日記 - MySQLグループ
PDOを利用して、last insert idを取得する -でじうぃき

February 12, 2015

MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く

MySQLではTIMESTAMP型の列にNULL制約かNOT NULL制約を付けないと自動的にNOT NULL制約が付く。これには驚いた。どういう理由でこういうことになってるんだろう。
例えば、以下のようなテーブルを作る。

CREATE TABLE tbl1 (
  id INT,
  dt1 TIMESTAMP,
  dt2 TIMESTAMP
)
ENGINE=InnoDB

そして以下のINSERT文を実行する。

INSERT INTO tbl1 (id) VALUES (1)

そうすると作成されたレコードのdt1,dt2はともにNULLだろうと、MySQL初心者の自分は思った。
しかし実際、そのレコードは以下のようになっている。入れた覚えのない値がdt1、dt2に入っている。

iddt1dt2
12015-02-12 22:47:320000-00-00 00:00:00

"SHOW CREATE TABLE tbl1" としてみると、結果は以下のようになる。

CREATE TABLE `tbl1` (
   `id` int(11) DEFAULT NULL,
   `dt1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `dt2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

dt1、dt2ともにNOT NULL制約が付いていて、さらにdt1はCURRENT_TIMESTAMP、dt2には意味不明なデフォルト値が設定される。
これは親切のつもりなんだろうか?BIGなお世話だ。それとも正当な理由があるんだろうか?そもそもdt2のデフォルト値の"0000-00-00"ってなんだ?西暦は1年から、元号も元年(1年)からで、「0年0月0日」なんて聞いたことがない。

MySQLではTIMESTAMP型の列ではNULLを許す場合、次のように明示的にNULL制約(?)を書いてやらないといけないようだ。そうでないと、上記のように勝手にNOT NULL制約とデフォルト値が付けられる。

CREATE TABLE tbl1 (
  id INT,
  dt1 TIMESTAMP NULL,
  dt2 TIMESTAMP NULL
)
ENGINE=InnoDB;

"SHOW CREATE TABLE tbl1" の結果は以下のようになる。

CREATE TABLE `tbl1` (
   `id` int(11) DEFAULT NULL,
   `dt1` timestamp NULL DEFAULT NULL,
   `dt2` timestamp NULL DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

参考ページ:
SQLのTIMESTAMP型と日付「0000-00-00」 - ディノオープンラボラトリ

February 11, 2015

MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする

MySQL Workbench でテーブルで TRUNCATE TABLE を実行したら、エラーになった。
原因はMySQLのクライアントがsafe updateモードという状態で、その状態ではWHEREやLIMITで制限をしていないDALETE文やUPDATE文、それにTRUNCATE TABLEは実行できないようになっているらしい。間違ってデータを全削除したり全更新するのを防ぐためだろうか。間違って全更新ならやったことあるなあ^^;
TRUNCATE TABLEできるようにするには、システム変数sql_safe_updatesを以下のようにして0にセットすればよい。

SET SQL_SAFE_UPDATES = 0;

現在、safe updateモードかどうかは以下のどちらかで調べられる。
SELECTの方は0か1、SHOWの方はONかOFFと表示される。

SELECT @@sql_safe_updates;
SHOW VARIABLES LIKE 'sql_safe_updates';

参考ページ:
MySQL Workbench でデータベースに接続してみる | セルティスラボ
MySQL ワークベンチで、TRUNCATE TABLE が失敗する-Oboe吹きプログラマの黙示録
MysqlWorkbenchでエラー(TRUNCATEとか)の対処|システム屋さんって何やねん!!
MySQL4.1/9.MySQLの実験/1.システム変数の参照と変更 - Ground-SunLight
田舎暮らしプログラマの技術メモ [MySQL] システム変数を表示する
mysql - How to check if sql_safe_updates is on? - Stack Overflow

February 08, 2015

MySQLメモ017:CREATE文、AUTO_INCREMENT、ENGINE

関連記事:
MySQLメモ004:テーブルの作成:
MySQLメモ013:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法

MySQLについては前に少し勉強したが、ほとんど忘れてしまった。
既存のシステムでMySQLを使っているものは触ったことはあるが、新規の開発でMySQLというのは初めてなので、色々メモ。

テーブルの主キーのカラムには、PostgreSQLの場合はシーケンスを用意してそこから値を取っていた。しかしMySQLにはシーケンスがない。
MySQLではカラムにAUTO_INCREMENT制約を付けてシーケンスの代わりにする。これでINSERT時に値を指定しなくても自動的に値がセットされる。初期値は1でINSERTするたびに自動的にインクリメントされる。
テーブル作成時のストレージエンジンの指定に "TYPE" を使っているものがあるが、現在は "ENGINE" が推奨されている。
CREATE TABLE文の例は以下。

CREATE TABLE test_tbl_01 (
  id INT AUTO_INCREMENT,
  name VARCHAR(20),
  mail VARCHAR(40),
  PRIMARY KEY(id)
)
ENGINE=InnoDB;

このテーブルにINSERT2回行って、SELECTする。

INSERT INTO test_tbl_01 (name) VALUES ('テスト一郎');
INSERT INTO test_tbl_01 (name, mail) VALUES ('テスト二郎', 'test.jiro@test.jp');
SELECT * FROM test_tbl_01;

SELECTの結果は以下のようになる。idには最初に1,2と連続した値が入る。

idnamemail
1テスト一郎
2テスト二郎test.jiro@test.jp

AUTO_INCREMENTの値は ALTER TABLE 文で設定できる。
また、TRUNCATE TABLEすると値はリセットされる。

参考ページ:
MySQLのauto_incrementについてメモ | Siguniang's Blog
AUTO_INCREMENTの値をリセットする方法【MySQL】 - Programming Magic select last_insert_id() - MySQL初心者日記 - MySQLグループ
ストレージエンジンの設定(ENGINE) - テーブルの作成 - MySQLの使い方

October 14, 2013

SQLインジェクション その7

関連記事:
SQLインジェクション その1
SQLインジェクション その2
SQLインジェクション その3
SQLインジェクション その4
SQLインジェクション その5
SQLインジェクション その6

脆弱性への対策

文字列リテラルの問題

SQLインジェクション脆弱性を快勝するにはSQLを組み立てる際にSQLの変更を防ぐことである。その具体策には以下の2つがある。

  1. プレースホルダによりSQL文を組み立てる。
  2. アプリケーション側でSQL文を組み立てる際に、リテラルを正しく構成するなどSQL文が変更されないようにする。

bは完全な対応は難しく、aのプレースホルダを使用することを強く推奨する。
PHPからDBを利用する場合、PEARのMDB2を推奨する。

プレースホルダを利用すると先の蔵書検索のSQLは以下のようになる。

SELECT * FROM books WHERE author = ? ORDER BY id

SQL文中の"?"がプレースホルダ(place holder)で、変数屋敷など可変パラメータの場所に埋め込んでおくものである。"place holder" とは「場所取り」という意味。
MDB2を利用してコードは以下のようになる(DBはPostgreSQL)。

<?php
require_once 'MDB2.php';
header('Content-Type: text/html; charset=UTF-8);
$author = $_GET['author'];
// 接続時に文字コード(UTF-8)を指定
$mdb2 = MDB2::connect('pgsql://<ユーザ名>:<パスワード>@<ホスト名>/<データベース名>?charset=utf8');
$sql = 'SELECT * FROM books WHERE author = ? ORDER BY id';
// SQL呼び出し準備。第2引数の配列でプレースホルダの方を指定する。
$stmt = $mdb2->prepare($sql, array('text'));
// SQL文実行
$rs = $stmt->execute(array($author));
// 表示処理は省略
$mdb2->disconnect();	// 切断
?>

プレースホルダ

プレースホルダには2種類の方式がある。

静的プレースホルダ

プレースホルダを含むSQLがそのままDBエンジンに送られ、DBエンジン側でコンパイルされる。次にバインド値がDBエンジンに送られてDBエンジン側で値を当てはめられた後にSQL文を実行される。
バインド値を入れる前にコンパイルされるのでSQLインジェクション脆弱性は原理的に発生ない。

動的プレースホルダ

アプリケーションのライブラリ側で値をバインドしてからDBエンジンに送られる。リテラルは適切に処理されるので処理系にバグがなければSQLインジェクション脆弱性は発生しない。

原理的にSQLインジェクションの可能性がない静的プレースホルダ方式の方が安全である。
動的プレースホルダの実装の問題でSQLインジェクション脆弱性が発生した例がある。

LIKE述語とワイルドカード

LIKE述語を使って "_" や "%" を検査する場合はこれらの文字をエスケープする必要がある。
このエスケープを怠ることとSQLインジェクションは別物だが混同している人が多い。

"_" や "%" を自体を検索したい場合はESCAPE句を指定してWHERE句はいかのようになる。

WHERE name LIKE '%#%%' ESCAPE '#'

DBエンジンによってエスケープが必要な文字は異なる。OracleやDB2では全角文字の "%" と "_" もエスケープの必要がある。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.4.1 SQLインジェクション

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

May 24, 2012

MySQLメモ015:設定ファイル

書式

MySQLの設定ファイルは、my.cnfである。Windowsの場合は my.ini と my.cnf である。
書式は以下。

書式 説明
# コメント
[<グループ名>] グループ宣言。この下にオプションを記述。グループの範囲は次のグループ宣言までかファイルの終わりまで。
<オプション名> コマンドラインの「--オプション名」と等価
<オプション名>=<値> コマンドラインの「--オプション名=値」と等価
!include <ファイル名> 指定したファイルを設定ファイルとして読み込む。
!include <ディレクトリ名> 指定したディレクトリ以下のファイルを設定ファイルとして読み込む。

読み込み順

設定ファイルは読み込む順序が決まっている。

UNIX系OSの場合
  1. /etc/my.cnf
  2. /etc/my.sql/my.cnf
  3. sysconfdir/etc/my.cnf
  4. $MYSQL_HOME環境変数に指定したディレクトリ/my.cnf
  5. --defaults-extra-file=オプション で指定したファイル(このオプションを持つコマンド/ツールのみ)
  6. ~/.my.cnf
Windowsの場合
  1. %System%\my.ini
  2. %System%\my.cnf
  3. %WINDIR%my.ini
  4. %WINDIR%my.cnf
  5. C:\my.ini
  6. C:\my.cnf
  7. $MYSQL_HOME環境変数に指定されたディレクトリ\my.ini
  8. $MYSQL_HOME環境変数に指定されたディレクトリ\my.cnf
  9. --defaults-extra-file=オプションで指定されたファイル(このオプションを持つコマンド/ツールのみ)
  10. バイナリの1つ上のディレクトリにあるmy.ini(たとえば、C:\mysql\bin\mysqld.exe の場合、C:\mysql\bin の1つ上の C:\mysql\)
  11. バイナリの1つ上のディレクトリにあるmy.cnf(たとえば、C:\mysql\bin\mysqld.exe の場合、C:\mysql\bin の1つ上の C:\mysql\)

--defaults-file オプション

--defaults-file=<ファイル> オプションをつけて起動すると、指定した設定ファイルのみを読み込む。
自分の環境(Windows)の場合、MySQLのサービスのプロパティの実行パスは以下のように --defaults-file オプションが使用されている。

"C:\applications\MySQL\MySQL Server 5.5\bin\mysqld" --defaults-file="C:\applications\MySQL\MySQL Server 5.5\my.ini" MySQL55

May 20, 2012

MySQLメモ014:コマンドラインクライアント その2

関連する記事:MySQLメモ001:コマンドラインクライアント: ぷ~ろぐ

ファイルを読み込んで実行する

コマンドが記述されたファイルを読み込んで実行して終了するにはリダイレクトを使用する。
-tオプションを付けると出力がインタラクティブモードと同じ形式になる。
-Nオプションを付けると出力にカラム名が表示されない。

C:\applications\MySQL\MySQL Server 5.5\bin>mysql -uhoge -p  sample_db < c:\data\sql.txt
Enter password: ********
id
1
2
3
4

C:\applications\MySQL\MySQL Server 5.5\bin>mysql -uhoge -p  sample_db -t < c:\data\sql.txt
Enter password: ********
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+

C:\applications\MySQL\MySQL Server 5.5\bin>mysql -uhoge -p  sample_db -N < c:\data\sql.txt
Enter password: ********
1
2
3
4

インタラクティブモードのコマンド一覧

helpコマンドはMySQLクライアントのインタラクティブモード用のコマンドの一覧を表示する。

mysql> help

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
notee     (\t) Don't write into outfile.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog
with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

For server side help, type 'help contents'

主なコマンド

コマンド 説明
charset キャラクタセットを変更する。
pager 1画面ごとに表示が停止するようにlessなどをページャーを指定する。UNIX環境のみ。
source コマンドファイルを読み込んで実行する。MySQLメモ001:コマンドラインクライアント参照。
status サーバのステータス情報を表示する。MySQLメモ001:コマンドラインクライアント参照。
system シェルのコマンドを実行する。UNIX環境のみ。
quit クライアントを終了する。
exit クライアントを終了する。quitと同じ。

結果の縦表示

コマンドの後のセミコロンを "\G"(バックスラッシュと大文字のG)にすると、結果を表形式ではなく1フィールド毎に改行する縦表示となる。

mysql> select * from order_item;
+----------+---------+---------+------+
| ORDER_ID | ITEM_ID | BOOK_ID | NUM  |
+----------+---------+---------+------+
|        1 |       1 | 0000005 |    2 |
|        1 |       2 | 0000002 |    1 |
|        2 |       1 | 0000006 |    1 |
|        2 |       2 | 0000003 |    2 |
+----------+---------+---------+------+
4 rows in set (0.00 sec)

mysql> select * from order_item\G
*************************** 1. row ***************************
ORDER_ID: 1
 ITEM_ID: 1
 BOOK_ID: 0000005
     NUM: 2
*************************** 2. row ***************************
ORDER_ID: 1
 ITEM_ID: 2
 BOOK_ID: 0000002
     NUM: 1
*************************** 3. row ***************************
ORDER_ID: 2
 ITEM_ID: 1
 BOOK_ID: 0000006
     NUM: 1
*************************** 4. row ***************************
ORDER_ID: 2
 ITEM_ID: 2
 BOOK_ID: 0000003
     NUM: 2
4 rows in set (0.00 sec)

参考ページ:
MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.7.1 mysql オプション
MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.7.2 mysql Commands

May 09, 2012

MySQLメモ013:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法

Java+MySQLなWEBアプリにおいて、AUTO_INCREMENTなカラムを持つテーブルにINSERTでレコードを挿入してから、その新規レコードのAUTO_INCREMENTなカラムの値を取得する方法について、ちょっとてこずったのでメモ。 環境は以下。
Java:1.6.0_31
MySQL:5.5.19

本やネットで調べると LAST_INSERT_ID() というMySQLの関数を使う方法もあるようだが、ここはせっかくなのでMySQLのJDBCドライバ(MySQL Connector/J)が提供するAPIを使ってみた。

サンプルコード
final String sql = "INSERT INTO orders (customer_name, address, payment) VALUES (?, ?, ?)";

DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/mysql");
Connection conn = dataSource.getConnection();
PreparedStatement statement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
statement.setString(1, customerName);
statement.setString(2, address);
statement.setInt(3, payment);
statement.executeUpdate();

// 上記の処理で登録したデータのAUTO_INCREMENTで生成されたIDを取得する
PreparedStatement stmt2
    = (PreparedStatement)((DelegatingPreparedStatement) statement)
        .getInnermostDelegate();
ResultSet rs = ((com.mysql.jdbc.PreparedStatement)stmt2).getGeneratedKeys();
if (rs.next()) {
	id = rs.getInt(1);
} else {
	throw new SQLException("failure: retrieve new id");
}

上記のコードのWEBアプリでは、JNDIで DataSource を取得し DataSource.getConnection() で java.sql.Connection を取得して変数connに入れている。
そのconnで作成した PreparedStaement を作成し statement に代入(5行目)する。ここで使用する prepareStatement() は引数にSQLとフラグを取るもので、フラグには Statement.RETURN_GENERATED_KEYS をセットする。

java.sql 
インタフェース Connection
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException
自動生成キーを取得する機能を持つデフォルトの PreparedStatement オブジェクトを生成します。
パラメータ:
sql - 1 つ以上の '?' IN パラメータプレースホルダーを含めることができる SQL 文
autoGeneratedKeys - 自動生成キーを返すかどうかを示すフラグ。Statement.RETURN_GENERATED_KEYS または Statement.NO_GENERATED_KEYS 
戻り値:
プリコンパイルされた SQL 文を含む新しい PreparedStatement オブジェクト。自動生成キーを返す機能を持つ 
例外: 
SQLException - データベースアクセスエラーが発生した場合、このメソッドがクローズされた接続に対して呼び出された場合、または指定されたパラメータが自動生成キーを返すかどうかを示す Statement 定数でない場合 
SQLFeatureNotSupportedException - JDBC ドライバが定数 Statement.RETURN_GENERATED_KEYS を指定したこのメソッドをサポートしない場合

作成した PreparedStaement は com.mysql.jdbc.PreparedStatement ではないらしい。statement を com.mysql.jdbc.PreparedStatement でキャストしようとすると例外が発生する。
そこで、 statement を org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement にキャストし、getInnermostDelegate() で内部に保持されていた PreparedStatement を取得し stmt2 に代入する(12-15行目)。この取得した PreparedStatement は com.mysql.jdbc.PreparedStatement らしいので getGeneratedKeys() で ResultSet を取得し AUTO_INCREMENT なカラムの値を取得する(15,17行目)。

org.apache.commons.dbcp 
クラス DelegatingPreparedStatement
public PreparedStatement getInnermostDelegate()
内部に保持する PreparedStatement が DelegatingPreparedStatement でない場合にはその PreparedStatement を返し、それ以外の場合には再帰的に getDelegate() をコールします。 
従ってこのメソッドは DelegatingPreparedStatement ではない根本の処理の委託先となる PreparedStatement を返し、 DelegatingPreparedStatement の連鎖の中に処理の委託先が見つからない場合には null を返します。 
このメソッドはネストした DelegatingPreparedStatement から 本来の PreparedStatement を取得したい場合に有用です。 

JNDIを使用せず下記のように Connection を取得した場合は DelegatingPreparedStatement#getInnermostDelegate() は不要で、直接キャストして getGeneratedKeys() を使えばよい。

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/java_sample_db", "java", "password");

参考ページ:MySQL :: MySQL 5.1 リファレンスマニュアル :: 24.4.5.1 JDBC の基本コンセプト

MySQLメモ012:ユーザー管理 その2

ユーザーの登録

GRANT 権限 [(カラム)] [,...]
  ON データベース.テーブル
  TO 'ユーザー'[@'ホスト'] [IDENTIFIED BY 'パスワード']
     [,...]

ユーザー名のみ指定した場合はどのホストからも接続できるようになる。
同じユーザー名でもホスト名が違えば異なるユーザーとして扱われる。

権限の剥奪

REVOKE 権限 [(カラム)] [,...]
  ON データベース.テーブル
  TO 'ユーザー'[@'ホスト'] [,...]

ユーザーの削除

DROP USER 'ユーザー'[@'ホスト'] [,...]

パスワードの設定

やり方は以下の4つある。

  • GRANT文でのユーザー登録時に IDENTIFIED BY で設定する。
  • SET PASSWORD を使用する。
    SET PASSWORD FOR 'ユーザー'[@'ホスト']=PASSWORD('パスワード')
    
  • UPDATEで権限テーブルにパスワードを設定する。
    権限テーブルuserを変更してパスワードを設定する場合、変更を反映させるには FLUSH PRIVILEGS を実行する必要がある。
    mysql> UPDATE user SET PASSWORD=PASSWORD('java') WHERE user='java';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.14 sec)
    
  • mysqladminコマンドを使用する。
    mysqladmin -uユーザ -hホスト password 新しいパスワード [-p]
    

May 08, 2012

MySQLメモ011:ユーザー管理 その1

権限テーブル

MySQLはmysqlデータベース内の以下のテーブルにアクセス権限の情報を持つ。

テーブル名 説明
user ユーザーの基本的な定義
host ホストに対する権限の定義
db データベースに対する権限の定義
tables_priv テーブルに対する権限の定義
columns_priv フィールドに対する権限の定義

主な権限

権限名 説明
ALTER ALTER文を許可。フィールドだけでなくテーブル名も変更できる。
CREATE データベースとテーブルの作成を許可。
DELETE DELETE文の実行を許可。
DROP データベースとテーブルの削除を許可。
FILE LOAD DATA文、SELECT ... INTO OUTFILE文の実行を許可。
INDEX インデックスの作成と削除を許可。
INSERT INSERT文の実行を許可。
LOCK TABLES LOCK TABLES文の実行を許可。
SELECT SELECT文の実行を許可。
SHOW DATABASES SHOW DATABASESの実行を許可。
UPDATE UPDATE文の実行を許可。
ストアドプロシージャ関連
EXECUTE ストアドプロシージャの実行を許可。
CREATE ROUTINE ストアドプロシージャの作成を許可。(バージョン5で追加)
ALTER ROUTINE ストアドプロシージャの変更を許可。(バージョン5で追加)
ビュー関連
CREATE VIEW ビューの作成を許可。(バージョン5で追加)
SHOW VIEW ビューの参照を許可。(バージョン5で追加)
権限関連
ALL PRIVILEGES 全権限を許可(省略形ALLでも可)。
GRANT OPTION 他のユーザーの権限変更を許可。
CREATE USER ユーザー作成を許可。(バージョン5で追加)
管理者操作関連
PROCESS mysqladmin processlist、mysqladmin killの実行を許可。
SUPER mysqladmin killの実行を許可。
RELOAD mysqladminのreload、refresh、flush-status、flush-privileges、flush-hosts、flush-logs、flush-tables、flush-threadsの実行を許可。
SHUTDOWN mysqladmin shutdownの実行を許可。
レプリケーション関連
REPLICATION CLIENT スレーブサーバーの情報の通知を許可。
REPLICATION SLAVE レプリケーションのスレーブとなることを許可。
その他
USAGE 権限一切なし。

特殊なユーザー

rootユーザー
MySQLの初期状態で登録されているユーザーの1つ。MySQLサーバーのすべての操作を行うことができる。
匿名ユーザー
MySQLの初期状態で登録されているユーザーの1つ。ユーザー名が空文字列。testと"test_"で始まる名前のDBに対してすべての権限を持っていて、他のDBには何の権限も持っていない。
December 2016
Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof