все что связано с моей работой
Главная » Програмирование » Авто перенос пользователей с в базу 12-го года

Авто перенос пользователей с в базу 12-го года

Из года в год при установки новой базы для АИСБП самая “трудоемкая” задача – это прописать права на всем пользователям на новую базу. А так как у меня 11 поселений и у всех руками это проделывать лениво, то родился вот этот небольшой скрипт, который переносит не отключенных пользователей существующих в базе Budget11K в новую базу 12-го года.

USE [Budget12K]
DECLARE @NAM VARCHAR (128)
DECLARE @LOG VARCHAR (128)
DECLARE @ST nvarchar(500)
DECLARE @CURSOR CURSOR
SET @CURSOR  = CURSOR SCROLL FOR 
  select name,loginname from master.dbo.syslogins 
  where denylogin=0 and password is not null order by name
OPEN @CURSOR
FETCH NEXT FROM @CURSOR INTO @NAM, @LOG
WHILE @@FETCH_STATUS = 0
BEGIN
  if exists (select * from [Budget11K].dbo.sysusers where name=@NAM) 
  begin
    print @NAM
    select @ST='CREATE USER ['+@NAM+'] FOR LOGIN ['+@LOG+']'
    EXEC sp_executesql @ST    
--    print @ST  /* Раскоментировать для отладки */
    if (@NAM='Admin')
      select @ST='EXEC sp_addrolemember N''Developer'', N''Admin'''
    else
      select @ST='EXEC sp_addrolemember N''LU'', N'''+@NAM+''''    
    EXEC sp_executesql @ST
--    print @ST /* Раскоментировать для отладки */
  end
  FETCH NEXT FROM @CURSOR INTO @NAM, @LOG
END
CLOSE @CURSOR
Рекомендую первый раз закоментировать строки 17,23 и убрать коментарий со строк 18,24. Тогда скрипт ничего не сделает, а выведет список команд которые собирался выполнить. Можно проверить что ничего «лишнего» не попало

Немного пояснений по работе, для себя. Так как это первая стычка с курсорами в T-SQL. 

  • 2-4 объявляем переменные: @NAM – имя пользователя, @LOG – его логин, @ST –(statement) – строка в которой будем формировать sql-команды, @CURSOR – собственно сам курсор;
  • 6-8 присваиваем нашему курсору набор данных. Немного о where нашей выборки, denylogin>0 если аккаунт отключен и у служебных аккаунтов нет пароля  там NULL
  • 9 – открываем наш курсор
  • 10 – дословно перейти на следующую строку (в нашем случае на первую) и засунуть данные в переменные name->@NAM, loginname->@LOG
  • 11 – будем делать пока @@FETCH_STATUS = 0, @@FETCH_STATUS – системная переменная, <>0 когда достигнет конца набора.
  • 13- проверяем есть пользователь с таким именем в базе 11-го года
  • 15 – просто для наглядности печатаем имя текущего пользователя.
  • 16 – формируем команду для создания пользователя.
  • 17 – выполняем сформированную команду.
Почему так? Почему бы не сразу выполнить CREATE USER …? Я не большой спец в T-SQL, но почему-то CREATE USER @NAM – упорно пыталась создать пользователя с именем @NAM и не воспринимала ее как переменную, вероятно есть способ заставить ее выполняться как положено, но мне проще и быстрее было сделать так
  • дальше формируем команду добавления роли созданному пользователю. Для простых пользователей LU и Developer для администратора.
  • снова выполняем нашу команду
  • переходим на следующую строку и обновляем наши переменные.
  • в окончании закрываем наш курсор.

Если при выполнении скрипта вываливаются ошибки, он не останавливается, а продалжает дальше. Например. Пользователь Admin уже есть в базе – в 17 строке ругнется и пойдет дальше, присвоит ему роль Developer. ИМХО это полезное свойство.

для того чтоб поставить одинарную кавычку в строке надо использовать ее два раза – ''

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

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.