0

관리자가 다른 앱의 인스턴스를 여러 개 만들 때만 사용하는 앱에서 작업합니다.레일 컨트롤러 내에서 Mysql 사용자 만들기 액션

즉, app A은 서버에 app B의 복제본을 생성하고 해당 복제 된 응용 프로그램을 서브 도메인 new_clone.domain.com에서 실행하는 데 필요한 모든 구성을 만드는 데 사용됩니다.

apache 설정 파일 unicorn server settings 파일도 생성하여 앱을 복제 할 수 있습니다. 레이크를 실행하려면 db:create; db:migrate하지만 나는 root mysql을 사용했다. 나는 응용 프로그램을 복제 지점에서

, 나는이 순간 usernamerootpassword 세트에있는 새 복제 된 앱의 database.yml 파일을 생성,하지만 복제 된 각 응용 프로그램에 대해 다른 사용자가 좋아 woould.

응용 A는 내가, 복제, 설정 파일을 생성, 레이크 작업을 실행하는 등 ... 그리고이 create 행동에 내가 만드는 모든 것들을 필요 않는 create 행동에 subdomains_controller.rb에서 Subdomain라는 모델을 가지고 특정 데이터베이스에 대한 권한이있는 새 Mysql 사용자

지금까지을 시도 무엇, 내가 작업을 생성 컨트롤러 내에서 MySQL의 명령을 실행하려고 내가 많이했다 말할 수 없다 :

def create 
    if @subdomain.save 
    .... 
    system "mysql -u root -p root; create database new_database;..." 
    .... 
    else 
    .... 
    end 
end 

을하지만 내가 할 때까지 내 생성 조치를두고 암호를 입력해라. 그리고 내가 그것을 뒤돌아 볼 방법을 찾을지라도 나는 나머지 mysql 명령이 작동 할 지 확신하지 못한다. 아마도 mysql 콘솔에 가지 않고 한 명령 줄에 MySQL 사용자를 추가하는 더 좋은 방법이있을 것입니다.

감사합니다.

+0

합니까 사용자가 데이터베이스 또는 사용자 생성에 필요한 권한 ? –

+0

음, 내 루트 사용자는 네,하지만 그건 생각입니다. 새 사용자를 만들 때 데이터베이스를 만들고 그 데이터베이스에만 모든 종류의 권한을 가져야합니다. – rmagnum2002

+0

이 명령은'-p'와'root' 사이에 공백이 있기 때문에 루트 암호를 묻습니다.'mysql' 맨 페이지를 확인하십시오. – toro2k

답변

1

내가 아는 한, 귀하의 create 메소드는 root mysql 사용자와 함께 Rails 응용 프로그램에서 실행됩니다. 나는 그것이 짧은 방법으로 작업을 얻었다 YURIY의 대답에

# Create DB 
ActiveRecord::Base.connection.execute("CREATE DATABASE IF NOT EXISTS \ 
`#{ActiveRecord::Base.sanitize(db_name)}` CHARACTER SET = `utf8` \ 
COLLATE = `utf8_general_ci`")  
# Create User 
ActiveRecord::Base.connection.execute("REPLACE INTO mysql.user \ 
(Host, User, Password) VALUES(\"localhost\", \ 
\"#{ActiveRecord::Base.sanitize(db_user)}\", \ 
PASSWORD(\"#{ActiveRecord::Base.sanitize(db_password)}\"))") 
# Grant access 
ActiveRecord::Base.connection.execute("GRANT ALL PRIVILEGES ON \ 
`#{ActiveRecord::Base.sanitize(db_name)}`.* TO \ 
`#{ActiveRecord::Base.sanitize(db_user)}`") 
# Apply 
ActiveRecord::Base.connection.execute("FLUSH PRIVILEGES") 
+0

감사합니다. 많은 도움을 주셨습니다. 그러나 조금 더 짧게 만들었습니다. 나는 그것도 대답으로 게시 할 것입니다. – rmagnum2002

0

감사 : 그런 다음 당신은 단순히 AR 어댑터를 통해 MySQL의 명령을 실행할 수 있습니다

def create_mysql_user 
    @db_name = "#{@subdomain.name}_domain_production" 
    @db_user = "#{@subdomain.name}_user" 
    @db_password = "#{@subdomain.name}domain_password" 

    ActiveRecord::Base.connection.execute("GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, 
     INDEX ON `#{@db_name}`.* TO #{ActiveRecord::Base.sanitize(@db_user)}@localhost 
     IDENTIFIED BY #{ActiveRecord::Base.sanitize(@db_password)};") 
    # Apply 
    ActiveRecord::Base.connection.execute("FLUSH PRIVILEGES") 
    end 
관련 문제