MySQL の プロシージャやファンクションは SHOW FUNCTION STATUS や information_schema.routines で確認できるけど、Oracle みたいにステータスが invalid とかは気にしなくてよさそう。
yohei.az on Twitter: "MySQL の プロシージャやファンクションは SHOW FUNCTION STATUS や information_schema.routines で確認できるけど、Oracle みたいにステータスが invalid とかは気にしなくてよさそう。 https://t.co/zAcizAxpMv"
https://dev.mysql.com/doc/refman/5.7/en/information-schema-routines-table.html
一応コンパイル済みのルーティンをキャッシュしてるんですが、キャッシュされてるルーティンが参照してるオブジェクトが消えたとかは検知してくれないですね。基本的に実行時コンパイル/実行時チェックなので、実行時エラーでキャッチするしかないという理解です。
Indigo on Twitter: "一応コンパイル済みのルーティンをキャッシュしてるんですが、キャッシュされてるルーティンが参照してるオブジェクトが消えたとかは検知してくれないですね。基本的に実行時コンパイル/実行時チェックなので、実行時エラーでキャッチするしかないという理解です。… "
あざます!RDS MySQL から Aurora MySQL にリードレプリカで移行する場合に、切替時にチェックすべき観点として必要か調べてたのですが、移行元と移行先で全オブジェクトを比較すればよさそうですね。
yohei.az on Twitter: "あざます!RDS MySQL から Aurora MySQL にリードレプリカで移行する場合に、切替時にチェックすべき観点として必要か調べてたのですが、移行元と移行先で全オブジェクトを比較すればよさそうですね。… "
基本的にオブジェクトがちゃんとすべて移行されてれば定義が同じなら問題ないですね。だいたいのケースではレプリケーションば OK にしちゃってましたが。RDS/Aurora だと使い方がちょっとトリッキーになっちゃいますが pt-table-checksum 使ったケースもありました。
Indigo on Twitter: "基本的にオブジェクトがちゃんとすべて移行されてれば定義が同じなら問題ないですね。だいたいのケースではレプリケーションば OK にしちゃってましたが。RDS/Aurora だと使い方がちょっとトリッキーになっちゃいますが pt-table-checksum 使ったケースもありました。… https://t.co/lYKazxH2QD"
こんにちは、平塚と言います。
2015年3月2日 10:40
: > MySQLでoracleのようにinvalid objectを確認する方法はありますか?
>
>効率的に確認する方法は、ないと思います。
■プロシージャの場合
(1) プロシージャを定義して実行
DROP PROCEDURE IF EXISTS test_invalid; DELIMITER // CREATE PROCEDURE test_invalid() DETERMINISTIC BEGIN SELECT ename FROM emp WHERE empno = 7788; END // DELIMITER ; CALL test_invalid(); +-------+ | ename | +-------+ | scott | +-------+(2) テーブル名を変更
ALTER TABLE emp RENAME emp_renamed;(3) プロシージャを実行するとエラー
CALL test_invalid(); ERROR 1146 (42S02): Table 'scott.emp' doesn't exist■ビューの場合
(1) ビューを定義して参照
CREATE VIEW emp_view AS SELECT * FROM emp; SELECT * FROM emp_view; (SELECT結果は省略)(2) テーブル名を変更
ALTER TABLE emp RENAME emp_renamed;(3) ビューを参照するとエラー
SELECT * FROM emp_view; ERROR 1356 (HY000): View 'scott.emp_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use themOracle DatabaseではDBA/ALL/USER_OBJECTSでINVALID列を確認することにより
(2)と(3)の間で事前にチェックをかけることができます。MySQLでは私の把握する限りそのような仕組みはないです。
mysql:16218
プロシージャでしたら動作確認する、ビューでしたらSELECT文を実行してみる
必要があると思います。