如何导出database.yml中所有用户对应的数据库Schema?
导出Oracle其他用户创建的表Schema的方法
这个问题本质是因为rake db:schema:dump默认只会导出当前数据库连接用户对应的schema下的表。要导出another_user或authority这类其他用户的表结构,有两种实用的解决方式:
方法一:针对特定环境单独导出
你已经在database.yml里配置了temp_development和auth_development这两个继承自基础配置的环境,直接针对这些环境执行dump命令即可,Rails会自动使用对应环境的用户身份连接数据库,导出该用户下的所有表:
# 导出another_user的表结构到默认schema.rb rake db:schema:dump RAILS_ENV=temp_development # 导出authority的表结构到默认schema.rb rake db:schema:dump RAILS_ENV=auth_development
如果不想覆盖原有的schema.rb,可以通过SCHEMA参数指定单独的输出文件,这样就能保留每个用户的schema文件:
# 导出到schema_temp_development.rb rake db:schema:dump RAILS_ENV=temp_development SCHEMA=db/schema_temp_development.rb # 导出到schema_auth_development.rb rake db:schema:dump RAILS_ENV=auth_development SCHEMA=db/schema_auth_development.rb
方法二:通过schema_search_path一次性导出多用户表
如果你想用admin用户一次性导出多个用户的表,首先需要确保admin拥有访问another_user、authority用户表的权限(比如DBA权限,或者针对每个表授权SELECT权限)。然后修改database.yml里的基础配置,添加schema_search_path参数:
development: &development adapter: oracle_enhanced database: some_db username: admin password: password schema_search_path: admin, another_user, authority
配置完成后,执行常规的dump命令,schema.rb就会包含这三个用户下的所有表,每个表会带上对应的用户前缀(比如another_user.table_name):
rake db:schema:dump
注意事项
- 执行不同环境的dump前,记得如果要保留原
schema.rb,先备份或者用SCHEMA参数指定新文件,避免覆盖。 schema_search_path需要Oracle enhanced适配器的支持,确保你的activerecord-oracle_enhanced-adaptergem版本是较新的。- 权限是关键:如果
admin没有访问其他用户表的权限,第二种方法会失败,此时只能用第一种方法切换用户导出。
内容的提问来源于stack exchange,提问作者Braham Shakti
相关产品推荐
相关产品推荐

