2013-08-15 4 views
2

Я пытаюсь решить проблему, которая возникла при создании пакета установки. Пакет установки написан в wix с помощью visual studio 2010. Пакет установки создает базу данных и добавляет некоторые таблицы в эту базу данных. Проблема возникает, когда пользователь выполняет установочный пакет и подключается к удаленному серверу, на котором создается база данных. Два участвующих хоста не находятся в одном домене, поэтому необходимо использовать аутентификацию sql-сервера. В установочном пакете я предоставляю пользователю возможность выбирать между Windows- и SQL-Server-аутентификацией. На данный момент пользователю предлагается диалог, в котором он может выбрать один из двух вариантов. Следствием любой из этих опций является то, что в файле, который хранит строку соединения, значение конфигурации, а именно переключатель Integrated Security, переключается между true и false. Проблема в том, что во время установки учетные данные пользователя используются для входа в удаленный сервер sql. Мне нужно изменить установщик, чтобы использовать учетные данные sql. Я знаю, что я могу добиться этого с помощью следующего SQL элемент:Как условно использовать два разных элемента SqlDatabase?

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

Если атрибут пользователя присваивается идентификатор элемента пользователя, обеспечиваемой WixUtilExtension:

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

То, что я не знаю как создать два разных элемента SqlDatabase, один для Windows - другой для SQL-аутентификации с тем же именем. В идеале я хочу иметь что-то вроде этого:

<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> 

Элемент SqlDatabase не позволяет Condition элементов, как дети, так что это должно быть сделано иначе. Но я не знаю, как это сделать. Можешь сказать мне?

ответ

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>.

Затем вы можете вызвать настраиваемое действие, которое устанавливает состояния действия компонентов в зависимости от значения SQLSERVER_AUTHENTICATION. Вы можете сделать это, позвонив по номеру MsiSetComponentState. Если вы используете управляемые пользовательские действия DTF, это делается путем установки session.Components["ComponentName"].RequestState.

В качестве дополнительной заметки вы можете предварительно установить SQLSERVER_AUTHENTICATION после переустановки с использованием одного из компонентов current install state, выполненного с использованием синтаксиса ?ComponentName. Если значение равно 2, компонент отсутствует, если он равен 3, компонент устанавливается.

UPDATE

Я предлагаю удалить атрибут User в SqlDatabase таблице, если пользователь выбирает проверку подлинности Windows. Пользовательские действия расширения sql запускаются после любого пользовательского интерфейса (даже при поиске базы данных), поэтому вы можете запускать свои собственные действия с помощью элемента 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

Спасибо за предложение, но я не» t хочу создать базу данных как таковую. Я вложил элемент SqlDatabase под фрагментом, поэтому он служит локатором, который я использую во всех элементах SqlString. Элементы SqlString заботятся о создании базы данных. Все они ссылаются на два идентификатора SqlDatabase, поэтому я спросил, есть ли возможность иметь два элемента SqlDatabase с одним и тем же идентификатором. Возможно, мне придется переписать мой установщик, чтобы не использовать элементы SqlString. – BdN3504

+0

Теперь я прибегал к решению, которое я пытался избежать: У меня есть две записи DatabaseLocator для каждой используемой базы данных. Например: ' '. Как вы можете видеть, один использует SqlAuthentication, а другой - атрибут User. Каждый компонент, содержащий элемент SqlString, теперь проверяет условие SQLSERVER_AUTHENTICATION и дублируется. – BdN3504

+0

Пример для дублированного SqlString Компоненты (Часть 1): '<Компонент Id = "DB_CMP" Guid = "PUT-GUID-ЗДЕСЬ" ключевого пути = "да"> <[CDATA [SQLSERVER_AUTHENTICATION = 0]]> ' – BdN3504

Смежные вопросы