DEFINER'i Birçok Görünümde Değiştir


25

Bir güncellemeden sonra veritabanlarımı yedeklerken sorun yaşıyorum . Nedenimi anlamaya çalışırken sistemime takılıyorum. Koştuğum bir sorgu bu sonucu verdi.

Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES

Bazı araştırmalardan sonra, bu görüşler için belirleyicinin sistemden tahliye edilmiş eski bir geliştirici hesabı olduğu görülüyor. Veritabanları ve bu sorunla ilgili görüşler çok sık kullanılmaktadır ve çoğu arşiv amaçlı tutulmaktadır.

Artık var olmayan bir tanımlayıcı ile yaklaşık 40 görüş var. Tanımlayıcıyı aynı anda her şeyde farklı bir hesaba değiştirmenin kolay bir yolu var mı? Bu dosyayı düzenleyip görünümleri yeniden oluşturabilmek için mysqldump'u tüm görünümleri bir dosyaya dökmek için basit bir yol var mı?


benim için, eksik hesabı veritabanına ekledim ve hata ortadan kalktı.
user1794918

Yanıtlar:


13

Tüm görünüm tanımlarını içeren bir metin dosyası oluşturun:

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

AllMyViews.sql'yi oradan düzenlersiniz. Ardından, Görünümleri Bırak

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

AllMyViews.sql'yi düzenledikten sonra yeniden yükleyin

mysql -uusername -ppassword -A < AllMyViews.sql

Bir şans ver !!!


İnformation_schema'nın view_definition değeri görünmüyorsa ancak SHOW CREATE VIEW düzgün çalışıyorsa +1 harika bir alternatif.
Derek Downey

DTest'in çözümünü teoride daha çok sevsem de, sistemimle ilgili bir şey çalışmasını engelliyordu. Temelde, show create ifadelerini bir dosyaya dökmek için yukarıdakileri kullandım ve bunları biraz elle düzenlemek ve sonra çalıştırmak zorunda kaldım.
Zoredache

SHOW CREATE VIEW, tanımlayıcı kullanıcı olmadığında çalışmaz - mysqldump ile aynı hatayı atar:The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555 19.04

@ Marki555 Ardından, bu kullanıcıyı geçici olarak oluşturmalısınız. koş CREATE USER 'abc'@'1.2.3.4';. Ardından, tekrar deneyin.
RolandoMySQLDBA 19.04.2010


25

Bilgi şeması ile birlikte ALTER VIEW kullanabilirsiniz . Bunu bir metin dosyasına atmaktan bahsettiniz, belki de böyle bir şey:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

Bunu mysql komut satırı ile karıştırın (farz edelim ki * nix, pencerelere aşina değilsin):

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

Sidenote: doğrudan information_schema girişini değiştiremezsiniz . Not2: Bu, bir kerede yalnızca bir veritabanı için çalışır, WHERE table_schema'yı bırakırsanız, her birine USE komutları eklemeniz gerekir.


Bunu sevdim çünkü benimkinden biraz daha az ilgili ve daha özlü görünüyor. +1 !!! (ALTER
VIEW'i

View_definition alanının neden boş olacağı hakkında bir fikriniz var mı? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; döndürür| Staff | |
Zoredache

Sohbetteki tartışmadan, süper ayrıcalıkla bir izin sorunu gibi görünüyor. bugs.mysql.com/bug.php?id=39733
Derek Downey

Mükemmel çözüm! +1
Pablo Martinez

En azından RedHat'ta, bir dosya çıktısı alıyorsanız, geri dönüşlerden kaçmanız gerekir, örn.echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
clav

3

Derek'in çözümünü otomatik hale getirerek, bu DEFINER'i tüm veritabanlarında tüm görünümlerde root@localhostayarlayıp SQL SECURITY INVOKER(ilk önce bunu istediğinizden emin olun!) Olarak değiştirecektir:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

UYARI: Çalıştırmadan önce tam bir mysql yedekleme yaptığınızdan emin olun (örn., Mysqld'i durdurarak ve / var / lib / mysql içindeki tüm dosyaları yedekleyerek) - tam da olsa ... Benim için çalıştı, ama YMMV .

ayrıca tüm tablolarınızı / görünümlerinizi şunlarla kontrol etmelisiniz:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

artık görünümlerdeki geçersiz tanımlardan şikayet etmemelidir.


Utanmadan bunu snippet'lerime ekledi. Teşekkürler!
stefgosselin

3

Veritabanının tüm görünümlerini dışa aktar <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

veya:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Düzenleyin views.sql(değiştiriciyi değiştirin) ve yeniden oluşturun:

cat views.sql | mysql <DB>

Gerekirse belirtin -uve -pdeğiştirin.


VIEWS hangi şekilde views.sqldüzenlenmeli? Ayrıca, onları yeniden nasıl oluşturulur?
SherylHohman

@SherylHohman Değişim DEFINER = olduser@oldhostiçin DEFINER = newuser@newhost, cat views.sql | mysql <DB>görünümleri yeniden oluşturur.
x-yuri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.