все что связано с моей работой
Главная » Програмирование » База АИСБП на 2013 год. Установка

База АИСБП на 2013 год. Установка

Может немного поздновато,  но лучше поздно, чем никогда. У нас было принято решение об установки базы 13 года после ноябрьских собраний депутатов, а для ФУ вообще после декабрьского.

Ну даже если и поздно, может для кого-то послужит шаблоном, да и в следующем году самому пригодиться.

Сразу уточню: у нас в районе надо выполнять 6-й пункт инструкции МФ.

Алгоритм согласно инструкции по установке, немного уточненная:

  1. Сделать копию БД Budget12K.
  2. скопировать файлы базы (Budget13K.*) и установить на них права.
  3. Выполнить скрипт «Присоединение базы данных 2013 года».
  4. Выполнить резервное копирование БД Budget13K в «Чистая база2013».
  5. Выполнить скрипт «КОПИРОВАНИЕ классификаторов в бд 2013.sql».
  6. Выполнить скрипт «Перенос данных проекта 13и 14 годов из 12 года».
  7. Каждому пользователю дать доступ к базе данных Budget13K — роль LU, для Admin – роль Developer.

Алгоритм определен, приступим к реализации. Сначала определим некоторые переменные, для удобства и чистку результатов от предыдущих установок обновлений:

@echo off
rem ************************
set SQLCMDUSER=sa
set SQLCMDPASSWORD=<все знают пароль>
set SQLCMDSERVER=DEPO
set SQLCMDDBNAME=Budget12K

set SQLCMD="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe"

set BACKUP12='C:\mssql2005\backup\12b13.bak'
set BACKUP13='C:\mssql2005\backup\Чистая база13К.bak'
rem ************************

cls
del /F /Q c:\result.txt
del /F /Q result.txt 
del /F /Q result.zip 
del *.txt

Установив переменные среды вида SQLCMD* избавляемся от необходимости прописывать соответствующие параметры в команде запуска SQLCMD. Переменные BAKCUP12 и BACKUP13 — полные имена файлов для бэкапов соответствующих баз. Обращаю внимание на одинарные кавычки, и еще маленький нюанс — кодировка должна быть OEM (DOS,866). B SQL Server должен иметь права на запись в эту папку, иначе — «Ошибка 5.»

И сразу небольшой скрипт: в файле результата установки сохраним название поселения где ставим:

echo Поселение: >> result.txt
%SQLCMD% -b -o 1.txt -Q "declare @PosName varchar(50) select @PosName=ConstantDesc from dbo.Apps_Constants where ConstantName='CUL_KF' print @PosName"
if NOT %ERRORLEVEL%==0 (
  echo "Error." >> result.txt
  goto :END
)
type 1.txt >> result.txt

Если при выполнении скрипта происходит ошибка, то SQLCMD завершается с не нулевым кодом возврата, как собственно и должна вести себя любая утилита командной строки. Правда я нигде не встречал описание такого поведения, но экспериментальным путем установлено, что при ошибке код возврата все таки не нулевой. Но все равно, на всякий случай, есть файл result.txt и другие выходные файлы, которые все равно надо проверять на предмет ошибок.

Подготовительные работы завершены, можем начинать.

Также как и выясняли название поселения выполним архивацию:

echo Backup
echo Backup:  >> result.txt
%SQLCMD% -b -o 1.txt -Q "BACKUP DATABASE [Budget12K] TO  DISK = %BACKUP12% WITH NOFORMAT, INIT,  NAME = N'Budget12K-Перед установкой 13К', SKIP, NOREWIND, NOUNLOAD,  STATS = 10"
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type 1.txt >> result.txt

Еще раз напомню что все должно быть в родной кодировке для cmd – DOS, здесь все в WIN1251 для читабельности.

Установка базы это почти простой шаг – надо просто перенести/скопировать файлы базы 13-го года в папку баз SQL Server-а, но тут тоже не все так просто, необходимо дать права на файлы базы:

echo Copy base files 2013
echo Copy base files 2013:  >> result.txt
move /Y *.mdf c:\mssql2005\data\
move /Y *.ldf c:\mssql2005\data\
cacls c:\mssql2005\data /E /P SQLServer2005MSSQLUser$DEPO$MSSQLSERVER:F
cacls c:\mssql2005\data\* /E /P SQLServer2005MSSQLUser$DEPO$MSSQLSERVER:F

Это можно сказать универсальный кусок — подойдет для любой базы и позволить устанавливать сразу несколько баз.

Дальше все однотипно, подряд выполняются разные скрипты. Единственное на что следует обратить внимание, — это то, что для каждого скрипта указывается свой выходной файл, чтобы потом легче было искать ошибки:

echo Attach base 2013
echo Attach base 2013:  >> result.txt
set SQLCMDDBNAME=Budget12K
%SQLCMD% -b -i "attach.sql" -o attach.txt
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type attach.txt >> result.txt
echo Backup to clear base
echo Backup to clear base:  >> result.txt
%SQLCMD% -b -o clear.txt -Q "BACKUP DATABASE [Budget13K] TO  DISK = %BACKUP13% WITH NOFORMAT, INIT,  NAME = N'Чистая база 13К', SKIP, NOREWIND, NOUNLOAD,  STATS = 10" 
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type clear.txt >> result.txt
echo Copy NSI
echo Copy NSI:  >> result.txt
%SQLCMD% -b -i "copy.sql" -o copy.txt
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type copy.txt >> result.txt
echo Move NSI
echo Move NSI:  >> result.txt
%SQLCMD% -b -i "move.sql" -o move.txt
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type move.txt >> result.txt
echo Update users
echo Update users:  >> result.txt
%SQLCMD% -b -i "update_users.sql" -o users.txt
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type users.txt >> result.txt
echo Update 1
echo Update 1:  >> result.txt
%SQLCMD% -b -i "dop1.sql" -o dop.txt
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type dop.txt >> result.txt

Сценарий dop1.sql – это «Дополнительный скрипт к базе данных 2013» от 22.10.2012. В конец добавил исправление путей для обновлений и вызов процедуры «Все отчеты всем пользователям»:

update Apps_Update set UpdatePath='\\depo\app\'
GO
execute Apps_AllReportsToAllGroups
GO

В завершении, сбор дополнительных данных и чистка за собой. Сюда можно поместить выполнение запросов об использовании АИСБП или еще что-нибудь. Я, например, хотел собрать информацию о «загруженности» и папки дистрибутивов. АИСБП в поселениях с 2006 года и на сегодняшний день там много собралось версий, которые им собственно не нужны. Все равно если что-то случается везут мне.

Все файлы результатов архивируем и переносим в корень диска С:, и чистим за собой.

:END
dir c:\distrib >> distrib.txt
dir C:\Distrib\distAISBP_PFO >> pfo.txt
dir C:\Distrib\distAISBP_PFO\utils >> utils.txt
dir C:\Distrib\distAISBP_PFO\common >> common.txt
dir C:\Distrib\distAISBP_PFO\report >> report.txt
"C:\Program Files\7-Zip\7z.exe" a -tzip -mx=9 c:\result.zip *.txt
copy /Y result.txt c:\ 
del *.txt

Отдельно стоит рассказать про скрипт update_users. Самое узкое, по времени если делать руками, место в нашем алгоритме это 7-й пункт. Необходимо зайти в каждого пользователя и прописать доступ и роль к базе. Еще очень желательно удалить из базы 13-го года пользователей которые там остались о МФ. Собственно дать доступ и прописать роль, как собственно и удалить не сложно:

Script

Жмем кнопку «Сценарий», получаем готовый скрипт по удалению/созданию пользователя. Тут начинается первая засада все команды используют имя пользователя в [], например:

DROP USER [user1]

Засада в том, что вместо [user1] нельзя написать, к примеру, [@login_name] или просто @login_name. Команда вывалит ошибку, что нет такого пользователя.

Но как оказалось есть замечательная инструкция exec, она исполняет сценарий который передается ей в качестве параметра! Остается только состряпать этот сценарий.

Все достаточно просто: создаем курсор со списком пользователей, в переменные заносим команды удаления этих пользователей и затем исполняем эти команды с помощью exec, потом повторяем со списком пользователей базы 12-го года, только вместо удаления команды добавления пользователя к базе и назначение ему роли:

USE Budget13K;
GO
declare @login_name varchar(50);
declare @stm varchar(2000);
declare @usr varchar(2000);
DECLARE users CURSOR FOR SELECT name FROM sys.database_principals where owning_principal_id is null and type='S' and sid is not null and sid<>0x00 and sid<>0x01;
OPEN users;
set @usr='';
set @stm='';
WHILE 0=0
BEGIN
  FETCH NEXT FROM users into @login_name;
  if @@FETCH_STATUS<>0 break;
  print 'deleting "'+@login_name+'"';
  IF  EXISTS (SELECT * FROM sys.schemas WHERE name = @login_name)
  set @usr=@usr+'DROP SCHEMA ['+@login_name+'];'+char(10);
  IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = @login_name)
  set @usr=@usr+'DROP USER ['+@login_name+'];'+char(10);
END
CLOSE users;
DEALLOCATE users;
exec(@usr);
exec(@stm);
GO

use Budget12K;
declare @login_name varchar(50);
declare @stm varchar(2000);
declare @usr varchar(2000);
DECLARE users CURSOR FOR SELECT name FROM sys.database_principals where owning_principal_id is null and type='S' and sid is not null and sid<>0x00 and sid<>0x01;
OPEN users;
set @usr='';
set @stm='';
WHILE 0=0
BEGIN
  FETCH NEXT FROM users into @login_name;
  if @@FETCH_STATUS<>0 break;
  print 'create "'+@login_name+'"';
  if @login_name='Admin' begin
    set @usr=@usr+'CREATE USER [Admin] FOR LOGIN [Admin];'+char(10);
    set @stm=@stm+'EXEC sp_addrolemember N'+char(39)+'Developer'+char(39)+', N'+char(39)+@login_name+char(39)+';'+char(10);
  end
  else begin
    set @usr=@usr+'CREATE USER ['+@login_name+'] FOR LOGIN ['+@login_name+'];'+char(10);
    set @stm=@stm+'EXEC sp_addrolemember N'+char(39)+'LU'+char(39)+', N'+char(39)+@login_name+char(39)+';'+char(10);
  end
END
CLOSE users;
DEALLOCATE users;
use Budget13K;
exec(@usr);
exec(@stm);
GO

Небольшие пояснения, таблица sys.database_principals – содержит пользователей базы данных,  sys.server_principals – это пользователи SQL Server-a (еще можно использовать  select loginname from sys.syslogins).

Блок where подбирался опытным путем, поэтому внимательно проверяем какие пользователи были добавлены:

  • owning_principal_id is null – уберет из выборки роли
  • type=’S’ – уберет «системного» пользователя «cluster1»
  • sid is not null – убирает «sys» и «INFORMATION_SCHEMA»
  • sid<>0x00 and sid<>0x01 – убирает «guest» и «dbo»

Все файлы в рабочем каталоге упаковываем с помощью WinRar в SFX. Cамый нормальный модуль SFX в WinRar, 7z — видимо «ниасилил». Коментарий для архива, с параметрами установки

;Расположенный ниже комментарий содержит команды SFX-сценария

Path=C:\distrib\distAISBP_PFO\2013\
SavePath
Setup=C:\distrib\distAISBP_PFO\2013\start.bat
Silent=2
Overwrite=1
Title=База для АИСБП на 2013 год
License=База для АИСБП на 2013 год
{

Обновления для АИСБП:

  • База для АИСБП нв 2013 год

ЧЕРНОЕ ОКНО НЕ ЗАКРЫВАТЬ!!!

} Shortcut=D, C:\Distrib\distAISBP_PFO\2013\Инструкция.doc, , "Инструкция АИСБП на 2013 год", АИСБП_2013_Инструкция, Shortcut=P, C:\Distrib\distAISBP_PFO\2013\Инструкция.doc, АИСБП, Инструкция_2013, Инструкция_2013,

При установки создаются два ярлыка на инструкцию: на рабочем столе и в меню «Пуск» — «Все программы» — «АИСБП»

Установка из такого архива занимает примерно 10 минут, на системном блоке DEPO(!!!), который раздавал МФ.

Как говориться «Лучше день потерять – потом за 5 минут долететь» Улыбка

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.