2

私たちのシステムでは、同じ構造を持つ複数のデータベースを使用しています。たとえば、1000 人の顧客がいる場合、1000 のデータベースがあります。各顧客に独自のデータベースを提供することを選択したため、手間をかけずにすべてのデータを一度に削除できます.

現在、データベース構造を年に数回更新する必要があります。そこで、すべてのスキーマをループするストアド プロシージャを書き始めました。しかし、動的 ​​USE ステートメントの実行に行き詰まりました。

私のコードは次のとおりです。

DECLARE V_SCHEMA VARCHAR(100);
SET V_SCHEMA = 'SomeSchemaName';
SET @QUERYSTRING = CONCAT('USE ', V_SCHEMA);
PREPARE S FROM @QUERYSTRING;
EXECUTE S;
DEALLOCATE PREPARE S;

このコードを実行すると、というエラーが表示されますError Code: 1295. This command is not supported in the prepared statement protocol yet。したがって、プロシージャでアクティブなデータベースを変更できないと想定しています。

私はインターネットを検索しましたが、私が見つけたのは、各変更クエリの文字列を作成し、それを準備/実行/割り当て解除することだけでした。これに対するより良い解決策があることを願っています。スキーマをループして SQL ファイルを実行するシェル スクリプトを作成することもできますが、私はこれを処理するストアド プロシージャを好みます。

これを機能させる方法を知っている人はいますか?

ご協力ありがとうございました!

編集:MySQL 5.6の最新の安定バージョンを使用しています

4

2 に答える 2

1

既知のデータベースがいくつかある場合は、CASE を作成してみてください。

それ以外の場合は、準備済みステートメントを使用して USE ステートメントを実行しないでください。代わりに、フルネーム -<database name> + '.' + <object name>で他のステートメント (SELECT、INSERT、UPDATE、...) を作成し、準備済みステートメントを使用してそれらを実行します。

于 2013-05-21T10:26:53.110 に答える
0

構造の変更を一時スキーマのストアド プロシージャに入れる場合は、Workbench SQL ウィンドウ内でこれを行うことができます。

information_schemaに対してクエリを使用して反復スクリプトを作成できます。

SELECT GROUP_CONCAT(CONCAT('USE ',schema_name,'; CALL tmp.Upgrade')
                    SEPARATOR ';\n') AS BldCode
FROM   information_schema.schemata
WHERE  schema_name NOT IN
       ('information_schema', 'performance_schema', 'mysql', 'sakila', 'world', 'tmp')

これを準備済みステートメントとして実行することはできないため、SQL の結果を新しい SQL ウィンドウにコピーして実行することができます。

構造変更ストアド プロシージャは、スキーマを指定するのではなく、現在のスキーマで操作する必要があることに注意してください。

于 2015-08-01T19:58:20.653 に答える