2013-09-03 15 views
14

İç geliştirme sunucumuz üzerinde çalışıyor ve MySQL 5.6.13 sunucumuzda MySQL Tetikleyicileri yaratıyorum. Şu anda sahip olduğum problem Tetikleyiciler (toplamda yaklaşık 200) dahili sunucuda DEFINER = root @% ile oluşturuldu.Nasıl MySQL Tetikleyicileri değiştirebilirim DEFINER

Şimdi canlı üretim sunucusuna geçmek istiyorum. Ancak canlı sunucumuzda, bu root için bu erişime izin vermiyoruz. o localhost

cevap

36

Tek yön @ Belirleyiciyi = root okur böylece nedenle nasıl bunu yapmak için, tüm Tetikleyiciler değiştirmek toplu olarak yapabilirsiniz:

1) bir dosyaya tetik tanımları dökümü

# mysqldump -uroot -p --triggers --add-drop-trigger --no-create-info \ 
     --no-data --no-create-db --skip-opt test > /tmp/triggers.sql 

2) En sevdiğiniz düzenleyicide triggers.sql dosyasını açın ve DEFINER s değerini değiştirmek için Find and Replace özelliğini kullanın. Güncellenen dosyayı kaydet.

3) Tekrar Oluştur dosyasından tetikler

# mysql < triggers.sql 
+1

Mac'te Zend Sunucusu – Wouter

+2

ile Mac OS X'te "bilinmeyen seçenek: --add-drop-trigger" iletisini alıyorum Bu yalnızca bazı ortamlarda çalışır. Cinsiyet 5.5.36 centOS üzerinde çalışmaz ... "mysqldump: bilinmeyen seçenek" --add-drop-tetik '" –

+0

benim için çalışıyor. – Janath

1

müşterilerimin çoğu 5.5 ile sunucularda barındırılan ve pek bu konuda yapabileceği ve --add-drop-trigger function was added in 5.6 çünkü kabul cevabı benim için işe yaramadı

Kafamı bunun üzerine vurduktan sonra, tetikleyici düzenleme sayfasındaki tanımlayıcıyı ortaya çıkaran phpMyAdmin'e girdim ve yalnızca yanlış olan 20 veya daha fazla tetikleyici için tanımlayıcıyı düzenledim - phpMyAdmin düşecek ve tetikleyiciyi yeniden oluşturacak yeni tanımlayıcı ile.

Bulduğum başka bir seçenek tam bir mysqldump yapmak, sonuçta oluşan dosyayı düzenlemek, yeni bir veritabanı oluşturmak için kullanmak, sonra da Navicat gibi bir aracı kullanmak ve orijinal veritabanına yalnızca istenen tetikleyicileri seçerek bir yapı senkronizasyonu yapmaktı. Sonuç karşılaştırma listesi. Bu benim için çok daha uzun bir süreçti, çünkü sadece 20 tetikleyiciyi düzenlemek zorunda kaldım, ancak yüzlerce tetikleyiciyi güncellemem gerekirse bu daha hızlı olurdu.

+1

Tabii ki, döküntünün oluşturduğu dosyayı düzenleyebilir ve 'bırakma tetikleyicisini ekleyebilirsiniz. triger adı var; – bartonlp

+0

Evet, ama bu biraz daha yazıyor. İyi bir DB karşılaştırma aracına sahip olmasaydım, bunun nasıl yapılacağı olurdu. –

3

--add bırak-tetik seçeneğini kullanarak olmadan:

currentUserDefiner='root' 
currentHostDefiner='localhost' 
newUserDefiner='user' 
newHostDefiner='localhost' 
db='myDb' 
mysqldump -u root --triggers --no-create-info --no-data --no-create-db --skip-opt $db \ 
| perl -0777 -pe 's/(\n\/\*.+?50003 TRIGGER `([^`]+)`)/\nDROP TRIGGER \2;\1/g' \ 
| perl -0777 -pe 's/(DEFINER[^`]+)'$currentUserDefiner'(`@`)'$currentHostDefiner'/\1'$newUserDefiner'\2'$newHostDefiner'/gi' \ 
> out.sql 
mysql -u root < out.sql 
1

başka bir yaklaşım bu Java programını kullanmaktır. Bu, mevcut sürüm 1.0'ın bazı sunucu değişkenlerini temizlediğinden devam eden bir çalışma olduğunu unutmayın. newdef

0

MySQL Workbench bir seçenek kullanan konuda bir başka çeşitleme daha sonra MyQSL Workbench içe istenen "Belirleyiciyi" ile değiştir bulmak, "mysqldump" seçeneğini kullanarak tüm veritabanı dökümü yetenekli bir editörü dökümü açmaktır içe aktarma ekranında seçilen "Döküm Yapısı Seçeneği" (v6.2).

İlgili konular