2013-08-15 3 views
2

설치 패키지를 만들 때 발생하는 문제를 해결하려고합니다. 설치 패키지는 Visual Studio 2010의 도움으로 wix로 작성되었습니다. 설치 패키지는 데이터베이스를 만들고 해당 데이터베이스에 테이블을 추가합니다. 이 문제점은 사용자가 설치 패키지를 실행하고 데이터베이스가 작성되는 원격 서버에 연결될 때 발생합니다. 참여하는 두 호스트가 동일한 도메인에 있지 않으므로 SQL Server 인증을 사용해야합니다. 설치 패키지에서 사용자는 Windows 및 SQL Server 인증 중 하나를 선택할 수 있습니다. 현재 사용자는 두 가지 옵션 중 하나를 선택할 수있는 대화 상자를 표시합니다. 두 옵션의 결과는 연결 문자열을 저장하는 파일에서 구성 값, 즉 Integrated Security 스위치가 truefalse 사이에서 토글됨을 나타냅니다. 문제는 설치 중에 사용자의 자격 증명을 사용하여 원격 SQL 서버에 로그인하는 것입니다. SQL 자격 증명을 사용하도록 설치 프로그램을 변경해야합니다.두 개의 다른 SqlDatabase 요소를 조건부로 사용하는 방법은 무엇입니까?

<util:User Id="SqlUser" Name="[SQLSERVER_USERNAME]" Password="[SQLSERVER_PASSWORD]" /> 

내가 모르는 무엇 : 사용자 속성이 WixUtilExtension에서 제공 한 사용자 요소의 ID를 할당

<sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master" User="SqlUser" /> 

: 나는 내가 다음과 같은 SQL 요소를 사용하여이를 달성 할 수있는 알고 두 개의 다른 SqlDatabase 요소를 만드는 방법입니다. 하나는 Windows 용이고 다른 하나는 SQL 용입니다. 동일한 이름의 인증입니다. 이상적으로는이 같은 것을 갖고 싶어 다음 SqlDatabase 요소는 어린이와 같은 조건 요소를 허용하지 않습니다

<sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master" User="SqlUser"><Condition>SQLSERVER_AUTHENTICATION=1</Condition></sql:SqlDatabase> 
<sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master"><Condition>SQLSERVER_AUTHENTICATION=0</Condition></sql:SqlDatabase> 

를, 그래서 이것은 다른 수행해야합니다. 하지만 어떻게해야할지 모르겠다. 말해 줄 수 있어요?

답변

1

사용자는 자신의 구성 요소에 두 개의 데이터베이스를 만들고 사용자의 선택에 따라 사용자 지정 동작을 사용하여 해당 구성 요소의 동작 상태를 변경할 수 있습니다.

<Component Id="SqlAuthDB" Guid="PUT-GUID-HERE"> 
    <sql:SqlDatabase Id="SqlAuthDB" Server="[SQLSERVER_SERVER]" 
     Instance="[SQLSERVER_INSTANCENAME]" Database="master" User="SqlUser" /> 
    <util:User Id="SqlUser" Name="[SQLSERVER_USERNAME]" 
     Password="[SQLSERVER_PASSWORD]" /> 
</Component> 

<Component Id="WinAuthDB" Guid="PUT-GUID-HERE"> 
    <sql:SqlDatabase Id="WinAuthDB" Server="[SQLSERVER_SERVER]" 
     Instance="[SQLSERVER_INSTANCENAME]" Database="master" /> 
</Component> 

이 거의 확실 파일 비용에 영향을, 그리고 내가 볼 수있는 유일한 해결 방법은, 같은 <Condition>1=0</Condition> 항상 false로 평가되는 조건으로 처음부터 그들 중 하나를 비활성화하는 것입니다.

그런 다음 SQLSERVER_AUTHENTICATION 값에 따라 구성 요소의 동작 상태를 설정하는 사용자 지정 동작을 호출 할 수 있습니다. MsiSetComponentState으로 전화하여이 작업을 수행 할 수 있습니다. DTF의 관리되는 사용자 지정 작업을 사용하는 경우 session.Components["ComponentName"].RequestState을 설정하면됩니다.

부수적으로 ?ComponentName 구문을 사용하여 구성 요소의 current install state 중 하나를 사용하여 다시 설치하면 SQLSERVER_AUTHENTICATION을 미리 설정할 수 있습니다. 값이 2이면 구성 요소가 없으며 3이면 구성 요소가 설치됩니다.

UPDATE

나는 사용자가 Windows 인증을 선택하면 SqlDatabase 테이블의 User 속성을 삭제하는 게 좋을 것. SQL 확장의 사용자 지정 작업은 모든 UI (심지어 데이터베이스를 찾는 경우) 후에 실행되므로 Publish 요소를 사용하여 사용자 지정 동작을 실행할 수 있습니다.

난 그냥 documentation 당신은 SQL이 아닌 기존 데이터베이스에 대해 문 실행되지 않을 수 있다고 보인다 것을 지적하고 싶습니다 : 제안에 대한

This allows MSI to install SqlScripts or SqlStrings to already existing databases on the machine. The install will fail if the database does not exist in these cases.

+0

감사합니다,하지만 난 돈 ' 데이터베이스 자체를 만들고 싶지 않습니다. 조각 아래에 SqlDatabase 요소를 중첩하여 모든 SqlString 요소에서 사용중인 로케이터 역할을합니다. SqlString 요소는 databse를 생성합니다. 그들은 모두 두 개의 SqlDatabase Id를 참조하기 때문에 동일한 ID를 가진 두 개의 SqlDatabase 요소를 가질 기회가 있는지 묻습니다. 아마도 SqlString 요소를 사용하지 않도록 설치 프로그램을 다시 작성해야합니다. – BdN3504

+0

필자는 피하려고했던 솔루션을 사용했습니다. 사용되는 각 데이터베이스에 대해 두 개의 DatabaseLocator 레코드가 있습니다. 예 : '. 보시다시피, 하나는 SqlAuthentication을 사용하고 다른 하나는 User 특성을 생략합니다. 이제는 SqlString 요소가 포함 된 모든 구성 요소가 SQLSERVER_AUTHENTICATION 조건을 확인하고 복제됩니다. 복제 된 SqlString 구성 요소에 대한 – BdN3504

+0

예 (1 부) : '<구성 요소 ID = "DB_CMP"가이 드 = "PUT-GUID-HERE"키 패스 = "예"> <[CDATA [SQLSERVER_AUTHENTICATION = 0] 중복 SqlString 부품 (파트 2)에 대한> ' – BdN3504

관련 문제