mysqldump를 사용하여 다른 데이터베이스 이름을 사용하여 가져와야하는 데이터베이스를 내보내려고합니다. mysqldump에 의해 생성 된 SQL을 보면 트리거가 원본 데이터베이스 이름으로 정규화 된 유일한 개체 이름이므로 내 필요를 잃어 버리는 것처럼 보입니다. 어쨌든 mysqldump가 트리거를 포함한 객체 이름을 완전히 한정하지 않도록 지시 할 수 있습니까?mysqldump는 데이터베이스 이름이 포함 된 트리거를 완전하게 지정합니다.
답변
나는 동일한 문제가있어서 해결책을 찾았습니다. 데이터베이스를 디자인하기 위해 MySQL Workbench를 사용하고 있었고 거기에 트리거를 몇 개 만들었습니다. 모두 을 제외한 구문을 사용했습니다 : CREATE TRIGGER dbname.trigger_name
(그냥 실수였습니다). Mysqldump 출력에는 동일한 방법으로 모든 트리거가 포함되었습니다. 단 하나만 데이터베이스 이름을가집니다.
Mysqldump는 SHOW CREATE TRIGGER
을 통해 볼 수있는 원래 CREATE TRIGGER
명령어를 사용합니다. 트리거를 데이터베이스 이름으로 정의한 경우 dbname이없는 트리거로 대체 (삭제 및 작성)하면됩니다.
대부분의 경우 트리거를 만들 때 데이터베이스 이름을 추가합니다. 데이터베이스 이름없이 트리거를 업데이트하십시오.
이 문제를 처리해야하는 지 오래되었지만 정규화 된 데이터베이스 이름을 사용하여 트리거를 작성한 것이 아니라고 확신합니다. mysqldump는 데이터베이스 이름으로 트리거 생성 스크립트를 생성합니다. 내가 만든 방법에 관계없이 정규화 된 –
이상적인 솔루션이 아니지만 다음을 통해 출력을 펌핑하면 트리거에 대한 데이터베이스 이름이 제거됩니다.
mysqldump ... opts ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/'
나는 이것을 검증하지 않을 것이다. (필자는 그것을 필요로했기 때문에 2 년이 넘었고, 가까운 장래에 그것을 필요로하지 않을 것이다.) 그러나 이것은 그럴듯하고 실용적인 해결책처럼 들리므로 나는 마킹을하고있다. 답변으로! 공유해 주셔서 감사합니다. –
하, 나는 1 년 전에이 해결책을 제시 한 @emre를보고 난 그를 쐈다. 그럼에도 불구하고, 그는 의심스럽고 당신의 주장을 고집하는 것이기 때문에 나는 표명 된 대답으로 당신을 떠날 것이다. 확실하게 반대되는 증거를 발견하면, 우리는 그 점을 고려할 것입니다. 지금 당장은 당신의 충고가 다른 사람들을 도울 수있는 좋은 기회라고 생각합니다. –
글쎄, 나는 똑같은 문제가 있었기 때문에 나는 그것을 테스트했다. 중요한 경우, MySQL 서버 버전은 5.5.29-0ubuntu0.12.04.1입니다. – ducin