Perl-скрипт, выполняющий команды mysql? - PullRequest
0 голосов
/ 03 августа 2011

Я новичок в Perl и пытался написать сценарий для RHEL-бокса, который будет автоматически настраивать ванильную БД для новых сайтов, которые мы создаем на нашем хосте.У меня уже работает оператор connect, и я могу подключиться и создать базу данных из сценария (Используется $ dbh-> do (qq (CREATE DATABASE $ dbcreate)); Это лучший способ ???), но яесть пара, которую я не смог выяснить, как заставить их работать.

Это команды mysql, с которыми у меня возникают проблемы.Какие-либо предложения?Спасибо!

$dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass);
$dbh->do( qq(CREATE DATABASE $dbcreate) );
$dbh->do(qq(GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `$dbcreate` . * TO 'moodle'@'%'`) );
$dbh->do( qq(FLUSH PRIVILEGES) );
$dbh->do( qq($dbcreate < MySQL_pristine.sql) );
$dbh->do( qq(USE $dbcreate) );
$dbh->do( qq(UPDATE md1_label SET content = REPLACE( content, "pristine", "$dbcreate")) );
$dbh->do( qq(UPDATE md1_label SET contents = REPLACE( contents, "pristine", "$dbcreate")) );
$dbh->do( qq(UPDATE md1_label SET questiontext = REPLACE( questiontext, "pristine", "$dbcreate")) );

DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX ,�' at line 1 at create-auto-db.pl line 52.
DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'test3 < MySQL_pristine.sql' at line 1 at create-auto-db.pl line 54.
DBD::mysql::db do failed: Table 'test3.md1_label' doesn't exist at create-auto-db.pl line 56.
DBD::mysql::db do failed: Table 'test3.md1_label' doesn't exist at create-auto-db.pl line 57.
DBD::mysql::db do failed: Table 'test3.md1_label' doesn't exist at create-auto-db.pl line 58.

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Две вещи выделяются для меня.

$dbh->do(qq(GRANT SELECT , INSERT , (snip), EXECUTE ON '$dbcreate' . * TO 'moodle'@'%'`) );

... у вас есть конечный обратный удар, который вы, вероятно, не намерены.

$dbcreate < MySQL_pristine.sql

... не совсем то, что вы хотите. Я думаю, что вы пытаетесь сделать, это прочитать этот файл в Perl и выполнить итерацию для каждого содержащегося в нем оператора SQL, вызвав для этого «$ dbh-> do ()». Если вам очень повезло, у вас есть одна строка на утверждение в этом файле .sql.

0 голосов
/ 04 августа 2011

Основная проблема, с которой вы столкнулись, - это интерполяция строк с использованием знака at.Если у вас есть что-то вроде qq{Here is my email: test@hotmail.com} - это терпит неудачу, потому что он пытается поместить переменную списка @hotmail, которая не существует.Либо используйте обратную косую черту, чтобы экранировать ее (т. Е. qq{Here is my email: test\@hotmail.com}), либо, если вам не нужно интерполировать какие-либо переменные, используйте не интерполирующую кавычку q{...}.

Сказав это, вам нужнобыть немного осторожным с некоторыми из этих утверждений.Вы помещаете значения переменных в эти операторы SQL, и это риск для атак с использованием SQL-инъекций.Я бы использовал $dbh->quote($dbcreate), чтобы получить строковую версию, и $dbh->quote_identifier($dbcreate), чтобы получить версию идентификатора значения $dbcreate, и внедрить эти значения. Это намного безопаснее, так как это позволит избежать того, чтобы кто-нибудь делал таблицы Боббина вас и дает вам имя базы данных, как: db'; DROP TABLE mysql.user; '; или подобное.DBI предоставляет как строковые, так и идентифицирующие кавычки, так что вы можете получать правильные виды цитирования по мере необходимости.Например:

my $quoted_id_dbcreate = $dbh->quote_identifier($dbcreate);
$dbh->do( qq(USE $quoted_id_dbcreate) );

Заполнители обычно лучше, но некоторые из этих утверждений администратора, вероятно, не будут их поддерживать, поэтому использование правильных кавычек для ввода значений, вероятно, будет необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...