kategorie:

menu:


Znovuvytvoření MySQL pohledů

23.04.2011   ::    topic: Linux

Dnes jsem se pustil do pročištění loginů ve firemní MySQL databázi a omezení přístupu na nejmenší nutnou množinu. Ukázalo se že odebrání uživatele z databáze není tak jednoduché jak se na první pohled zdálo. Po odebrání uživatelů po nich zbylo hodně pohledů, ke kterým nelze přistupovat.

mysql> select * from userView;
ERROR 1449 (HY000): The user specified as a definer ('user'@'192.168.100.0/255.255.252.0') does not exist

Takových pohledů máme v databázi hodně a aplikace na nic závisí. Prolezl jsem internet tam a zpět a nenašel jsem žádný jednodušší způsob jak pohledy přidělit jinému vlastníkovi než je dropnout a vytvořit znova…

Výsledkem mé lenosti je tento script:

#!/bin/bash 

password=mySecretPassword
db=$1
mkfifo /tmp/mypipe 1>/dev/null 2>&1
echo "show tables; "  |  mysql -p$password --user=root --host=localhost $db \
            | tail -n +2 | while read table ; do
        if [ `mysqldump -v -f -p$password --user=root --host=localhost --extended-insert=TRUE $db $table
                    > /dev/null 2>/tmp/mypipe | grep -c error /tmp/mypipe` -gt 0 ] ; then
                echo "-- DB $db TABLE $table "

                sql=`echo "show create table \\\`$table\\\`; "  |  mysql -p$password --user=root --host=localhost $db \
                    | grep VIEW | sed "s/^[^(]*\\\`$table\\\` AS //"`
                echo "DROP VIEW `$table`; CREATE VIEW `$table` AS "$sql";"
        fi
done 

Výstup:

./mysql_find_bad_views.sh myDB
-- DB myDB TABLE userView
DROP VIEW `userView`; CREATE VIEW `userView` AS (select * from table);

Ten pak stačí vzít a po kontrole vložit do MySQL konzole…