Получить папку базы данных SQL Server выбранного экземпляра с помощью vbscript - PullRequest
2 голосов
/ 17 ноября 2008

Предположим, что у вас есть работающий экземпляр SQL Server Express с именем (local) \ SQLEXPRESS. Его папка базы данных - c: \ program files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data.

Как использовать VBScript для извлечения этой папки?

Может быть, с помощью SMO? И если да, то как? <- Забудь об этом. SMO использует .NET. Возможно только в PowerShell. </p>


Обновление: Причина этого заключается в том, что я разрабатываю установку MSI, которая использует настраиваемое действие (вызов сборки на основе .NET) для присоединения файлов mdf к существующему экземпляру сервера SQL. для этого файлы .mdf переносятся с установочного носителя на жесткий диск. Таким образом, установка должна знать, где разместить файлы.

Поскольку я хотел бы поддерживать стандарты, мне нужно поместить файлы в общую папку данных.


Обновление: При выборе экземпляра сервера SQL в InstallShield свойство IS _ SQLSERVER _ SERVER устанавливается с именем экземпляра.

Я обнаружил, что могу запросить реестр в HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Instance Names \ SQL, чтобы получить имя SQL для имени экземпляра (например, SQLEXPRESS -> MSSQL.1).

С этой информацией я могу запросить HKLM \ Software \ Microsoft \ Microsoft SQL Server \ MSSQL.1 \ Setup, чтобы получить ключ SQLDataRoot. Когда я добавляю \ Data к найденному здесь значению, у меня есть папка, которую я искал.

Однако есть ли лучший способ?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2008

Свойство PrimaryFilePath из SQL-DMO выглядит интересно.

В MSDN говорится, что SQL-DMO устарела с SQL Server 2008, но на данный момент он все еще должен работать.

Если вы больше не хотите использовать SQL-DMO, я думаю, что в пространстве имен root\Microsoft\SqlServer WMI может быть что-то пригодное для использования. Но Microsoft либо очень хорошо это скрыла, либо мои навыки поиска оставили меня, на данный момент я ничего не могу найти в этом отношении.

(РЕДАКТИРОВАТЬ: Удалено что-то, что не отвечает на вопрос.)

Путь к данным по умолчанию также хранится в реестре:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\DefaultData

Я не уверен, куда экземпляры записывают свои данные, но это должно быть где-то в логической близости.

2 голосов
/ 17 ноября 2008

Если бы вы сказали, почему вы это делаете, это может быть проще.

SQL Server позволит вам разместить ваши файлы на любой букве локального диска (даже master, model, msdb и temp могут быть перемещены), хотя во время установки для каждого экземпляра используется папка по умолчанию.

Поскольку я хотел бы поддерживать стандарты, мне нужно поместить файлы в общую папку данных.

Если бы я был администратором базы данных, устанавливающим ваше программное обеспечение, я бы предпочел, чтобы вы не помещали их в это место (которое обычно находится на диске C:). Я бы предпочел, чтобы вы спросили меня, где их устанавливать, потому что, если эти базы данных используются даже в умеренно значительной степени, они будут работать на дисках SAN, где я могу легко увеличить емкость, и я бы хотел, чтобы база данных и журналы работали на отдельных дисках (т.е. не то, как Microsoft устанавливает по умолчанию), а журнал, особенно на диске (, т.е. не C: ), где, если он заполнится, я не собираюсь каким-либо образом выводить из строя мой сервер.

0 голосов
/ 13 августа 2017

Используйте этот код в настраиваемом действии,

strName = "(local)\SQLEXPRESS"
arrNames = Split(strName, "\")
intIndex = Ubound(arrNames)
strFile =  arrNames(intIndex)
strFile = trim(strFile)

if strFile <> "" then
    reg = readFromRegistry("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\" & strFile & "\Setup\SQLPath", "")
    reg = trim(reg)
    if reg <> "" then
        reg = reg & "\DATA"
    end if
end if

msgbox reg

function readFromRegistry (strRegistryKey, strDefault )
    Dim WSHShell, value

    On Error Resume Next
    Set WSHShell = CreateObject("WScript.Shell")
    value = WSHShell.RegRead( strRegistryKey )

    if err.number <> 0 then
        readFromRegistry= strDefault
    else
        readFromRegistry=value
    end if

    set WSHShell = nothing
end function

Переменная reg будет извлекать путь. Вы можете указать имя экземпляра в переменной strName в начале.

Источник функции реестра: Как проверить значение реестра с помощью VbScript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...