2

いくつかのテーブルにしかアクセスできないユーザーがいる MySQL DB があります。このユーザーはCREATE TEMPORARY TABLESこのデータベースに対して許可されており、クエリ ログを確認すると、一時テーブルが作成され、そこから選択しようとすると失敗することがわかります。その時点GRANT SELECT ON TABLE 'db'.'tmp_tbl' TO 'user'@'localhost';でテーブルが存在しないため、実行は機能しません。

このページのユーザーのコメントは、これを行うためのハックを示唆していますが、もっと良い方法があると期待していました.


これを使用するコードは、次のようなものです。

CREATE TEMPORARY TABLE t1 SELECT id FROM real1 LIMIT 10;
CREATE TEMPORARY TABLE t2 SELECT id FROM real2 LIMIT 10;

SELECT * FROM t1;
SELECT * FROM t2;
SELECT * FROM t1 JOIN t2 JOIN real3 AS r ON t1.id = r.a AND t2.id = r.b;

この場合、要点は、データ (または少なくともその一部) がライブであるということです。
最初の 2 つのクエリの結果と 3 番目の結合の値が同じである必要があるため、サブクエリを使用しても機能しません。

4

1 に答える 1

1

一時テーブルの「作成」権限以上のものを付与できるようにする作業が進行中のようですが、まだ完了していないようです: http://bugs.mysql.com/bug.php?id=27480

リンク先のマニュアルページに記載されている回避策も同様に機能します。MySQL のデータベース間で参加できるのでtmp、回避策からテーブル トリックを実行したと仮定すると、次のことができます。

SELECT tmp.t1.a, tmp.t2.b, realdb.real3.c FROM tmp.t1
       ^^^       ^^^       ^^^^^^
JOIN tmp.t2 ON  tmp.t1.somefield=tmp.t2.otherfield
     ^^^        ^^^              ^^^
JOIN realdb.real3 ON tmp.t2.yetanotherifeld = realdb.real3.yetanotherotherfield
     ^^^^^^          ^^^                      ^^^^^^
etc...

クエリで (サンプルの ^^^ で示されているように) データベースを指定するだけで、MySQL は喜んで参加します。

于 2010-09-05T08:13:30.650 に答える