在Windows X64中使用inno setup和postgreSQL创建安装程序

时间:2016-02-16 11:08:00

标签: postgresql inno-setup

我为我的应用程序创建了一个安装程序,它也安装了postgreSQL。

第一个问题:

配置我的数据库的最佳方法是什么,我的意思是,使用postgres默认用户帐户会更好吗?或者我应该创建一个新用户。使用默认公共模式还是更好,还是应该创建新模式?可以看出,我正在寻求使用数据库的最佳实践。另外,我需要对任何其他应用程序中已安装的postgreSQL版本采取何种谨慎措施?

第二个问题:

如何使用安装程序创建用户? 我正在尝试创建一个与默认用户不同的新用户,但是如何为该用户设置密码?我想这样做而不会在命令shell中提示用户。

如果它有用,我会很乐意发布我的任何代码!

1 个答案:

答案 0 :(得分:2)

让我们在你的问题中提出一些要点。

  

配置数据库的最佳方法是什么,我的意思是,使用postgres默认用户帐户会更好吗?

根据您为用户安装强密码而言,这根本不重要,您将会感觉良好。

  

使用默认公共模式是否更好,还是应该创建新模式?

这取决于您的软件。如果您希望在使用数据库时对所有内容进行良好定义和组织,请为您的系统创建一个模式。如果你的系统是唯一一个使用PostgreSQL的人为什么会这么做?从DBA论坛PostgreSQL and default Schemas

阅读此问题的答案
  

另外,对于任何其他应用程序的已安装的postgreSQL版本,我可能会采取什么样的关注?

这是一个技巧,这是你将遇到的第一个问题。如果你已经安装了PostgreSQL数据库,我发现你很难安装PostgreSQL数据库。即使你卸载它也不行(在这种情况下你必须从PostgreSQL的Windows注册表中删除所有相关的注册表)。

我的建议是,您在安装程序上发出一条消息,说明您的系统需要在目标计算机上全新安装PostgreSQL,而且它上面没有安装PostgreSQL,否则安装将失败。我知道这很糟糕,但我在这里找不到任何事情。我做的另一件事是向用户添加关于安装程序消息的注释,如果他仍然想要在该机器上安装系统,他将不得不联系"支持"手动完成。

  

如何使用安装程序创建用户?

从这里我将添加一些命令,以无人参与模式安装PostgreSQL。

  

我尝试创建一个与默认用户不同的新用户但是如何为该用户设置密码?

使用与默认用户不同的用户安装PostgreSQL所需的命令将是:

postgresqlInstallFile[withversion].exe --mode unattended --superaccount super_user_name --superpassword yourStrongPassowordHere 

如果您可以在安装程序中询问密码并在上述命令中使用变量,那将非常棒。

仅此一项将使用您定义的用户安装数据库。以下是有关PostgreSQL Unattended Install

的所有参数的文档

第二个问题是关于你系统的数据库。我能找到的最好的做法是从我需要安装的数据库中创建一个Dump文件(这个数据库是空的,只有结构),将这个转储文件添加到安装程序中,这样我就可以将它导入到新的安装数据库。

此方法的问题是您无法输入超级帐户的密码而无法创建数据库或将其还原到PostgreSQL。我做的是

  • 向用户添加消息,他应该注意安装程序消息和步骤,以免他弄错了
  • 安装PostgreSql数据库后,出现了创建数据库的步骤,因此我使用命令:

[path_for_postgresq]/createdb.exe -U user_you_created -W -E UTF8 -O user_you_created "NameOfYourDatabase"

  • 在我运行上述命令之前,我向用户显示了一条消息,他将看到一个提示密码的提示屏幕,所以他必须输入它并按Enter键。您无法将其添加为参数(PostgreSQL表示它是用于安全措施)

  • 创建数据库后,可以导入我在安装程序中添加的转储,以便我使用:

[path_for_postgresq]/pg_restore -U user_you_created -c -d NameOfYourDatabase DumpFileOfYourDatabase.backup

再一次,在此命令之前,我向用户显示了一条消息,要求输入数据库恢复命令的密码。

这里我将添加我为NSIS安装程序创建的代码。只是PostgreSQL的一部分。我的安装程序还有很多,你可能还需要更多东西。

;--------------------------------
;Include Modern UI
!include "MUI.nsh"
;Include Process checker
!include nsProcess.nsh
;Include ZipDLL
!include zipdll.nsh
; include for some of the windows messages defines
!define ALL_USERS
!include winmessages.nsh

;--------------------------------
;General Configuration
    Name "Name of your Installer"
    OutFile "fileNameOfYourInstaller.exe"

    ShowInstDetails "show"

    InstallDir $PROFILE\FolderWhereToInstallYourSystem

    ; Request application privileges for Windows Vista
    RequestExecutionLevel admin

    ; HKLM (all users) vs HKCU (current user) defines
    !define env_hklm 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
    !define env_hkcu 'HKCU "Environment"'

;--------------------------------
;Interface Settings
    !define MUI_ABORTWARNING

;--------------------------------
;Pages
    !insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES

;--------------------------------
;Languages
    !insertmacro MUI_LANGUAGE "English"

Function .onInit
    SetOutPath $TEMP
    # the plugins dir is automatically deleted when the installer exits
    InitPluginsDir
    File /oname=re.bmp re.bmp  #here is an image for a splash screen of the installer

    splash::show 2000 re

    Pop $0  ; $0 has '1' if the user closed the splash screen early,
            ; '0' if everything closed normally, and '-1' if some error occurred.
FunctionEnd

Function verifyInstallationDIR
    IfFileExists $INSTDIR PathGood
        MessageBox MB_OK "The chosen directory is not valid for installation.$\r$\nPlease start again and inform a valid path."
        Quit ;if $INSTDIR wasn't created the installer will close
    PathGood:
FunctionEnd

Section
    SetOutPath $TEMP
    CreateDirectory $INSTDIR

    #Message to the user to PAY ATTENTIOM
    MessageBox MB_OK "Please carefully read all messages through installation steps!"

    Call verifyInstallationDIR
    #Files needed to the installer
    File "resources\DatabaseDumpFile.backup"
    File "resources\postgresql-9.3.9-3-windows-x64.exe"

    #Call postgresql installation in an unattended mode
    ExecWait 'postgresqlInstallFile[withversion].exe --mode unattended --superaccount super_user_name --superpassword yourStrongPassowordHere'

    Postgresql_Running_Check: 
        ; is app.exe process running? result is stored in $R0 
        ${nsProcess::FindProcess} "postgres.exe" $R0
        ${If} $R0 > 0
            MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "PostgreSQL process is not running yet. Wait 30 seconds and click Retry or Cancel to cancel installation." /SD IDCANCEL IDRETRY Postgresql_Running_Check
            Quit
        ${EndIf}

    ;Create the database
    MessageBox MB_OK "The System DataBase will be created. A console window will appear asking for a password. Please when it happens type:$\r$\n$\r$\nyourStrongPassowordHere"
    ExecWait '$PROGRAMFILES64\PostgreSQL\9.3\bin\createdb.exe -U user_you_created -W -E UTF8 -O user_you_created "NameOfYourDatabase"'

    MessageBox MB_OK "The System Installer will import the configuration data to the database. It will ask again for the password. Please when it happens type:$\r$\n$\r$\nyourStrongPassowordHere"
    ExecWait '$PROGRAMFILES64\PostgreSQL\9.3\bin\pg_restore -U user_you_created -c -d NameOfYourDatabase DatabaseDumpFile.backup'

SectionEnd

希望它有所帮助。