none
[РЕШЕНО ]Drop Schema с помощью PowerShell (Ошибка) Не удается индексировать в массив NULL RRS feed

  • Вопрос

  • Добрый день, Помогите с следующей проблемой

    Есть скрипт который удаляет с SQL сервера (SQL 2008 R2) Логин, Пользователя и Схему (аналогичную имени пользователя.) 

    Если есть только Логин и Пользователь - все работает хорошо.

    Если только добавляется схема - сразу появляеются 2 Ошибки. 

    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null $Error.Clear() cls $Servers = @("server1","server2")

    $logins = @("domain\GolovchenkoAO_test","domain\wwwtest") foreach($server in $Servers) { $srv = New-Object('Microsoft.SqlServer.Management.Smo.Server')$server #drop database users foreach($database in $srv.Databases) { foreach($Login in $logins) { if($database.Schemas.Contains($Login)) { $srv.Databases[$database].Schemas[$Login].Drop() } if($database.Users.Contains($Login))              {  $srv.Databases[$database].Users[$Login].Drop()              }         } }


    Здесь приведены ошибки (и какие именно строки их вызывают)

    $srv.Databases[$database].Schemas[$Login].Drop()

    Не удается индексировать в массив NULL.
    C:\Users\GolovchenkoAO\Documents\Работа - Задания\20130215 - Удаление старых записей из SQL\powershell - sql - Drop User,Login,Schema on all servers with procedure and LOG   and send email v 1.3 - Рабочий экземпляр.ps1:83 знак:29
    +                             $srv.Databases[$database].Schemas[$Login].Drop()
    +                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray

    $srv.Databases[$database].User[$Login].Drop()

    Исключение при вызове "Drop" с "0" аргументами: "Действие Удалить завершилось неудачно для объекта "Пользователь" "domain\GolovchenkoAO_test". "
    C:\Users\GolovchenkoAO\Documents\Работа - Задания\20130215 - Удаление старых записей из SQL\powershell - sql - Drop User,Login,Schema on all servers with procedure and LO
    G   and send email v 1.3 - Рабочий экземпляр.ps1:114 знак:27
    +                           $database.Users[$Login].Drop();
    +                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : FailedOperationException

    Самое интересное что если я вручную (а не через скрипт) выполняю эти команды - все отрабатывает отлично.








    13 марта 2013 г. 9:19

Ответы

  • Думаю вопрос можно закрывать. Видимо заработался и надо было отдохнуть.

    В общем ситуация следующая - из командной строки можно дропнуть с помощью

    $srv.Databases['MyDB'].Users['domain\GolovchenkoAO_test'].Drop()

    Но в скрипте необходимо использовать $database.Users[$Login].Drop()

    • Помечено в качестве ответа Frenzy from DP 13 марта 2013 г. 13:36
    13 марта 2013 г. 13:36

Все ответы

  • Вручную вы эти команды выполняете в той же последовательности, что и скрипт?
    13 марта 2013 г. 12:10
  • Да в той же. Это выглядело примерно так. 

    Для отлавливания ошибок я сделал что бы перед каждой командой мне выводило следующую информацию (Сервер БазаДанных Пользователь) - так видно с какими данными работает скрипт.

    Собственно я увидев ошибку

    Сервер БазаДанных Пользователь

    Server MyDB domain\user

    Не удается индексировать в массив NULL.
    C:\Users\GolovchenkoAO\Documents\Работа - Задания\20130215 - Удаление старых записей из SQL\powershell - sql - Drop User,Login,Schema on all servers with procedure and LOG   and send email v 1.3 - Рабочий экземпляр.ps1:83 знак:29
    +                             $srv.Databases[$database].Schemas[$Login].Drop()
    +                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray

    Выполняю команду 

    $srv.Databases['MyDB'].Schemas['domain\user'].Drop()

    И схема удаляется без проблем.

    13 марта 2013 г. 12:59
  • Думаю вопрос можно закрывать. Видимо заработался и надо было отдохнуть.

    В общем ситуация следующая - из командной строки можно дропнуть с помощью

    $srv.Databases['MyDB'].Users['domain\GolovchenkoAO_test'].Drop()

    Но в скрипте необходимо использовать $database.Users[$Login].Drop()

    • Помечено в качестве ответа Frenzy from DP 13 марта 2013 г. 13:36
    13 марта 2013 г. 13:36