Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Информационный Канал Subscribe.Ru


#099<<  #100

СОДЕРЖАНИЕ

1.ОЧЕРЕДНОЙ ЮБИЛЕЙ ПРОЕКТА SQL.RU
1.1.Статьи на сайте SQL.RU
1.1.1.Основы администрирования
1.1.2.Сравнение версий
1.1.3.Безопасность
1.1.4.Применение T-SQL
1.1.5.Оптимизация эффективности исполнения запросов
1.1.6.Разрешение проблем
1.1.7.Программирование доступа к данным из приложений
1.1.8.Репликация
1.1.9.Data Transformation Services
2.БЕЗОПАСНОСТЬ
2.1.Очередной, направленный на Microsoft SQL Server вирус Worm.SQL.Spida закрывает оставленныеные нерадивыми DBA бреши в системе безопасности.
3.СОВЕТЫ
3.1.XML в MS SQL Server 2000 и технологиях доступа к данным (продолжение)
3.1.1.XML-представление наборов данных в ADO .NET
3.1.2.Прямые XPath-запросы к объектам SQL Server
3.2.Передача логинов и паролей между SQL серверами
3.2.1.Передача логинов и паролей между серверами SQL Server 7.0
3.2.2.Передача логинов и паролей между серверами SQL Server 7.0 и SQL Server 2000 или между SQL Server 2000 серверами
3.2.3.Скрипт перемещения логинов с паролями и оригинальными SID между SQL серверами
3.2.4.Рекомендации
5.ССЫЛКИ НА СТАТЬИ
5.2.Новые технические статьи Microsoft

ОЧЕРЕДНОЙ ЮБИЛЕЙ ПРОЕКТА SQL.RU

Вот и прошёл ещё один, уже второй год с того момента, когда в Рунете появился сайт SQL.RU и рассылка "MS SQL Server - дело тонкое…". Наш совместный с Александром Сибилёвым проект по-прежнему остаётся некоммерческим и по-прежнему медленно и неуклонно развивается… Многое удалось, а ещё больше из наших задумок не удалось воплотить в жизнь, но мы твёрдо верим, что сможем найти время для того, что бы сделать сайт и рассылку ещё более интересными и удобными для наших посетителей. Тем более, хочется выразить особенную нашу благодарность тем людям, которые помогали нам в этом деле, а особенно авторам статей, которые безвозмездно передали их для размещения в рассылке и на сайте. Это: Алексей Неупокоев, Алексей Шуленин, Вячеслав Брылёв, Глеб Уфимцев, Дмитрий Приходько, Сергей Забалуев и Сергей Снисаренко. Надеемся, что наше сотрудничество продолжиться и скоро появятся новые авторы, которые захотят поделиться своими знаниями и опытом с нашей уважаемой аудиторией, которая за прошедший год удвоилась и перевалила за десять тысяч. В качестве небольшого отчёта о проделанной за два года работе, предлагаю Вам ссылки на статьи, опубликованные за это время на сайте SQL.RU:

Статьи на сайте SQL.RU

Основы администрирования

001.Шпаргалки для теста Микрософт №70-028 «Администрирование MS SQL Server 7.0»
002.Настройка SQL Mail для Microsoft SQL сервера 6.5/7.0
003.Восстановление связи между пользователем БД и его login
004.Вы можете оценить оптимальность использования памяти SQL сервером за две минуты
005.Перемещение баз данных SQL Server 7.0 в другое место
006.Проблемы и отладка инсталляции MS SQL Server 7.0
007.Утилиты MS SQL Server
008.Усечение transaction log в SQL Server 2000 с помощью команды DBCC SHRINKFILE
009.Настройка SQL Сервер 2000
010.Немного о фиксированных ролях
011.Выбор модели восстановления SQL Server 2000
012.Метод быстрого усечения журнала транзакций и перевода БД в offline
013.Перемещение базы путём отсоединения и присоединения её файлов
014.MS SQL Server и кэширующие дисковые контроллеры + FAQ
015.Как переименовать SQL Server
016.Кто такой - DBA? - Краткий обзор
017.Копирование базы данных MS SQL Server
018.Запуск по расписанию трассировки средствами SQL Server Profiler с использованием расширенных хранимых процедур
019.SQL Server 2000 Copy Database Wizard - использование и разрешение проблем

[Содержание]

Сравнение версий

001.Сравнение SQL Server 6.5, SQL Server 7.0 и SQL Server 2000
002.Поддерживаемые SQL Server версии Windows
003.Новшества SQL Server 2000
004.Выбор версии SQL Server 2000

[Содержание]

Безопасность

001.Создание гибкой системы безопасности MS SQL Server 7.0/2000
002.Рекомендации по защите Microsoft Data Engine

[Содержание]

Применение T-SQL

001.SP_MSForeachtable или жизнь без курсоров
002.SQLMAIL изнутри
003.Не документированные расширенные хранимые процедуры SQL Server 7.0/2000
004.Полезные, недокументированные хранимые процедуры SQL Server 2000
005.Хранимая процедура "For Each Table"
006.Использование процедуры sp_makewebtask
007.Реализация простого аудита с помощью триггеров
008.SQL Server 2000. Недокументированная системная хранимая процедура sp_readerrorlog
009.Недокументированный SQL
010.Обоснование использования динамических SQL запросов
011.SQL Mail и CDO – новые возможности Windows 2000
012.Сервис событий в SQL-сервере
013.Древовидные структуры в SQL
014.Шифрование данных с помощью функции ENCRYPT

[Содержание]

Оптимизация эффективности исполнения запросов

001.Эффективность использования индексов
002.Oптимизация данных для повышения эффективности работы приложений
003.Как избегать узких мест при использовании временных таблиц
004.Тюнинг индексов и статистики SQL сервера для повышения эффективности исполнения запросов
005.Правда, о fill-factor в MS SQL Server
006.Оптимизация работы SQL Server за счёт грамотного использования файлов и filegroups
007.Повышение производительности распределенного запроса

[Содержание]

Разрешение проблем

001.Как восстанавливать работоспособность SQL Server, если база данных Tempdb в состоянии Suspect
002.Усечение журнала транзакций в SQL Server 7.0
003.Причины заполнения журнала транзакций SQL серверов 4.2x, 6.0, 6.5, 7.0
004.Что делать, если журнал транзакций не очищается, даже после DUMP TRAN WITH NO_LOG
005.Уловка, позволяющая обойти критическое (Emergency) состояние базы данных и особенности DUMP TRANSACTION WITH NO_LOG
006.Восстановление файлов и резервное копирование filegroup
007.Как резервировать оставшиеся в Transaction Log записи, если база Master и файлы пользовательской базы повреждены
008.Добавление и удаление файла базы данных между резервированиями журнала
009.Что делать, если список баз данных в Enterprise Manager открывается очень долго
010.Мониторинг эффективности MS SQL Server. Практические рекомендации.

[Содержание]

Программирование доступа к данным из приложений

001.Доступ к данным с помощью ADO.NET
002.Доступ к XML и реляционным данным
003.Доступ к данным средствами АSP.NET
004.Семь инструментов Visual Studio .NET для работы с базой данных

[Содержание]

Репликация

001.Установка Merge репликации: Пошаговое руководство
002.Сверка данных при Merge репликации
003.Репликация транзакций, выполняющаяся в Non-Continous режиме
004.Не документированный параметр: ForceConvergenceLevel для Merge Agent
005.Новый Trace Flag, разрешающий модификацию Singleton для репликации транзакций
006.Настройка TCP/IP для издателя (publisher) и дистрибутора (distributor) при публикации через FTP
007.Фильтрация реплицируемых данных
008.Настройка Proxy Server для поддержки репликации SQL Server через Internet
009.Вывод расширенной информации о работе агентов репликации SQL Server в текстовый файл

[Содержание]

Data Transformation Services

001.Разрешение проблем контекста безопасности при выполнении DTS пакета в задании по расписанию

В настоящее время сайт меняет хостинг и переходит на платформу .NET. К великому нашему сожалению, этот процесс не удаётся провести без временной потери функциональности, некоторые разделы мы ещё не успели перенести на новую платформу, а самый популярный раздел сайта - форум, будет готов только к концу этой недели. Приносим Вам свои извинения за временные неудобства и будем стараться максимально быстро исправить положение. Кроме того, у нас к Вам огромная просьба, высказать в нашем специально созданном для этого разделе форума свои замечания и пожелания по поводу оформления, функциональности и содержания сайта. Мы будем очень благодарны за любую критику, советы и подсказки…

С уважением, Александр Сибилёв и Александр Гладченко

[Содержание]

БЕЗОПАСНОСТЬ

…и очередной, направленный на Microsoft SQL Server вирус Worm.SQL.Spida закрывает оставленные нерадивыми DBA бреши в системе безопасности.

По сообщению на сервере viruslist.com ( http://www.viruslist.com/viruslist.html?id=272179 ), компьютерный червь Worm.SQL.Spida.a., рассылается через серверы с установленным сервером Microsoft SQL. Червь получает доступ к серверам, используя пароль "sa", устанавливаемый по умолчанию при установке сервера. При запуске червь сканирует сеть и ищет компьютеры с доступным портом TCP 1433. Затем он пытается установить соединение с этим компьютером и войти в систему с учетной записью системного администратора. Если соединение проходит успешно, червь создает на атакуемой системе новую учетную запись пользователя Windows NT "sqlagentcmdexec", создает для нее случайный пароль и добавляет в группе "Administrators" и "Domain Admins". Далее червь получает доступные ресурсы для администратора на атакуемом компьютере и пытается копировать себя в папку "system32" каталога установки Windows. Червь закрывает уязвимость, которая позволила ему пробраться на компьютер. Для этого он устанавливает не пустой пароль учетной записи системного администратора. Затем червь запускает себя уже на атакуемом компьютере.
Для того чтобы атаковать удаленные серверы, червь использует утилиту, первоначально известную как "sqlpoke". Она генерирует произвольные значения IP адреса и ищет уязвимые машины. Когда потенциально уязвимая система обнаружена, компонента запускает другой файл, который подключается к этой машине и копирует на нее код червя. Червь также пытается отослать имена пользователей, пароли и список баз данных на сервере SQL по трем адресам электронной почты.
Новая версия червя Worm.SQL.Spida.b, в отличие от версии "a", вместо утилиты "sqlpoke" использует JavaScript. Она ищет брешь в системе безопасности для проникновения на атакуемые компьютеры. Также эта версия не добавляет новую учетную запись "sqlagentcmdexec" во время атаки. Вместо этого она устанавливает для пользователя "guest" права системного администратора. Поменялся также адрес электронной почты, на который отсылаются собраные пароли и названия баз данных. Теперь это единтсвенный адрес в домене "postone.com". Алгоритм перебора IP адресов был полностью переписан. Теперь вместо полностью произвольного выбора используется список предпочтений из 58 адресов. Этот список используется для определения первой цифры IP адреса. С вероятностью 84% червь выбирает один из адресов из списка. Для второй цифры адреса выбирается случайное число, третья цифра это число от 1 до 255, четвертая число от 1 до 254. Для оставшихся 16% червь выбирает случайное число для первой цифры IP адреса в диапазоне от 1 до 223. Таким образом, червь может лучше и быстрее определить уязвимые системы, что способствует его быстрому распространению.

[Содержание]

СОВЕТЫ

XML в MS SQL Server 2000 и технологиях доступа к данным (продолжение)
По материалам конференции "Корпоративные базы данных 2002"

Автор: Алексей Шуленин

1. Введение
2. Сохранить как XML
3. Получить как поток XML
4. XML на стороне сервера. FOR XML
5. SQLXML-классы в .NET
6. FOR XML на стороне клиента

7. XML-представление наборов данных в ADO .NET

На самом деле даже без провайдера SQLXMLOLEDB и SQLXML веб-релизов в Visual Studio .Net (точнее, в ADO.Net) имеются достаточно мощные средства для представления реляционных наборов данных в виде XML, и наоборот, XML в реляционном виде. Типовой сценарий работы выглядит следующим образом: получить внутри объекта DataSet таблицы как результаты запросов к источнику данных (возможно, к разным), связать их между собой на основе объектов DataRelation и создать XML-представление DataSet'a при помощи XmlDataDocument, как показано в Скрипте 6.

using System.Data;
using System.Data.OleDb;
using System.Xml;
...
static void Transform_ADONetDataSet_Xml()
{
   DataSet ds = new DataSet("Новый набор данных на клиенте");
   (new OleDbDataAdapter("SELECT CustomerID, ContactName, ContactTitle FROM Customers", ConstDeclarations.ConnectionString)).Fill(ds, "Клиентская копия табл.клиентов");
   (new OleDbDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", ConstDeclarations.ConnectionString)).Fill(ds, "Клиентская копия табл.заказов");
   ds.Relations.Add("Джойн двух копий на клиенте",
   ds.Tables["Клиентская копия табл.клиентов"].Columns["CustomerID"],
   ds.Tables["Клиентская копия табл.заказов"].Columns["CustomerID"]).Nested = true;
   XmlDataDocument xml = new XmlDataDocument(ds);
   FileInfo f = new FileInfo("..\\Results\\ADONetDataSet.xml");
   xml.Save(f.FullName);
...
}

Скрипт 6

Результирующий XML можно видеть на рис.2.

<Новый_x0020_набор_x0020_данных_x0020_на_x0020_клиенте>
   <Клиентская_x0020_копия_x0020_табл.клиентов>
      <CustomerID>
ALFKI</CustomerID>
      <ContactName>
Maria Anders</ContactName>
      <ContactTitle>
Sales Representative</ContactTitle>
      <Клиентская_x0020_копия_x0020_табл.заказов>
         <OrderID>
10643</OrderID>
         <CustomerID>
ALFKI</CustomerID>
         <OrderDate>
1997-08-25T00:00:00.0000000+04:00</OrderDate>
      </Клиентская_x0020_копия_x0020_табл.заказов>
      <Клиентская_x0020_копия_x0020_табл.заказов>
         <OrderID>
10692</OrderID>
...

Рис. 2

По умолчанию из DataSet будет сгенерирован документ, в котором каждой записи DataRow соответствует элемент с именем DataTable. Значения полей присутствуют в виде подэлементов DataRow с названиями соответствующих полей DataColumns. Поскольку DataSet предполагает отсоединенный режим работы, отношения между таблицами в источнике (в БД на SQL Server) не принимаются во внимание. Так, несмотря на связывание таблиц в запросе:

(new OleDbDataAdapter("SELECT c.ContactName, c.ContactTitle, o.OrderDate FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID", Connection)).Fill(ds);

с точки зрения DataSet это плоское множество записей, потому что связи отработал сервер и прислал в DataSet готовый табличный результат. Для образования иерархического XML-документа, где записи дочерней таблицы являются вложенными элементами родительской, отношение между таблицами нужно указывать явно в DataSet.Relations, при этом свойство .Nested объекта DataRelation должно быть выставлено в true. (Иначе записи из родительской и дочерней таблиц будут перечислены друг за другом на одном и том же уровне иерархии). Класс XmlDataDocument является производным от DOMовского XmlDocument, поэтому с его помощью над DataSet'ом можно выполнять все стандартные XML-операции: XPath-запросы, XSL-преобразования и т.д.

static void Update_ADONetDataSet_Xml()
{
   OleDbConnection cn = new OleDbConnection("Provider=SQLOLEDB;...");
   DataSet ds = new DataSet();

   OleDbDataAdapter daCust = new OleDbDataAdapter("SELECT CustomerID, ContactName, ContactTitle FROM Customers", cn);
   //Создаем UpdateCommand вручную
   daCust.UpdateCommand = new OleDbCommand("UPDATE Customers SET ContactName = ?, ContactTitle = ? WHERE CustomerID = ?", cn);
   daCust.UpdateCommand.Parameters.Add("@ContactName", OleDbType.VarChar, 40, "ContactName");
   daCust.UpdateCommand.Parameters.Add("@ContactTitle", OleDbType.VarChar, 40, "ContactTitle");
   daCust.UpdateCommand.Parameters.Add("@CustomerID", OleDbType.Char, 5, "CustomerID");
   daCust.Fill(ds, "Cust");

   OleDbDataAdapter daOrds = new OleDbDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", cn);
   //Создаем UpdateCommand автоматически
   OleDbCommandBuilder cbOrds = new OleDbCommandBuilder(daOrds);
   daOrds.Fill(ds, "Ords");

   ds.Relations.Add("Джойн двух копий на клиенте",
   ds.Tables["Cust"].Columns["CustomerID"],
   ds.Tables["Ords"].Columns["CustomerID"]).Nested = true;
   ds.EnforceConstraints = false;

   XmlDataDocument xml = new XmlDataDocument(ds);
   //Эквивалентно ds.Tables["Cust"].Select("CustomerID = 'ALFKI'")[0]["ContactName"] = "Maria Anders";
   xml.SelectSingleNode("//Cust[CustomerID='ALFKI']/ContactName").InnerText = "Maria Anders";
   xml.SelectSingleNode("//Cust[CustomerID='ALFKI']/Ords[OrderID=10643]/OrderDate").InnerText = "1997-08-25T00:00:00.0000000+04:00";
   daCust.Update(ds.Tables[1]); daCust.Update(ds.Tables[0]);
   ...
}

Скрипт 7

Скрипт 7 демонстрирует, что данные источника можно модифицировать не только напрямую через DataSet (ds.Tables[<Имя или номер таблицы в коллекции>].Rows[<Номер записи в коллекции>][<Имя или номер поля в коллекции>] = …), но и через его XML-представление. В примере изменяются значений некоторых XPath-узлов объекта XmlDataDocument. Эти изменения отражаются в DataSet'е, над которым построен данный XmlDataDocument, а поскольку у соответствующих DataAdapter'ов таблиц определены UpdateCommand'ы, то они будут транслированы далее в источник данных (SQL Server). Обратное тоже верно. Т.е. в DataSet можно подгрузить XML-документ, который затем читать и модифицировать реляционными операциями. В Скрипте 8 мы получаем схему построенного в предыдущем примере XML-файла при помощи утилиты xsd.exe, входящей в состав .NET Framework, читаем ее в XmlDataDocument и загружаем туда данные из этого документа. На основе XSD-схемы ADO.Net создает DataSet эквивалентной реляционной структуры, так что становится возможным обращаться и модифицировать XML-документ, как если бы он был совокупностью связанных таблиц.

static void Update_XML_ADONetDataset()
{
   FileInfo f = new FileInfo("..\\Results\\ADONetDataSet.xml");
   Process.Start("xsd.exe", f.FullName + " /o:..\\Results");
   XmlDataDocument xml = new XmlDataDocument();
   xml.DataSet.ReadXmlSchema(Path.ChangeExtension(f.FullName, ".xsd"));
   xml.Load(f.FullName);
   xml.DataSet.Tables["Cust"].Select("CustomerID='ALFKI'")[0]["ContactName"] = "Абра Кадабра";
   xml.DataSet.Tables["Ords"].Select("OrderID=10643")[0]["OrderDate"] = DateTime.Now;

...
}

Скрипт 8

Неплохим иллюстративным примером было бы приложение, которое документирует пользовательские библиотеки классов .Net в базе данных. Определения классов и объекты сохраняются в виде XSD-схем и XML-документов (см. System.Xml.Serialization), а на их основе, в свою очередь, при помощи рассмотренного соответствия реляционного и XML-представлений, которое обеспечивает ADO.Net, создается и наполняется БД. В качестве самостоятельного упражнения вы можете попробовать сами написать такое приложение и назвать его, скажем, Cheops.
Впрочем, я отвлекся. Чрезвычайно мощная и развитая функциональность ADO.Net по своей сути представляет собой результат эволюции простой возможности сохранения ADODB.Recordset в формате XML на стороне клиента, с которой начинался наш разговор (см. п.2). Вернемся, тем не менее, к основной теме - поддержке XML в SQL Server.

[Содержание]

8. Прямые XPath-запросы к объектам SQL Server

В Скрипте 7 было показано, как осуществлять XPath-навигацию по связанным таблицам в ADO.Net Dataset. Подобным же образом XPath-запросы можно адресовать к SQL Server 2000, как если бы это был XML-ресурс, а не сервер реляционных баз данных. Под словом "прямые" подразумевается, что эти запросы обращаются к объектам базы данных напрямую, а не через аннотированные схемы, о которых речь пойдет в следующем параграфе. В Скрипте 9 приведен запрос, выводящий всех клиентов с именами, начинающимися с букв X, Y, Z.

static void Direct_XPathQuery_SQLXML()
{
   SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLOLEDB;...");
   cmd.CommandText = "Customers[@ContactName>=$НачБуква]/@ContactName";
   cmd.CommandType = SqlXmlCommandType.XPath;
   SqlXmlParameter prm = cmd.CreateParameter();
   prm.Name = "@НачБуква"; prm.Value = "X";
   cmd.RootTag = "Root";
   XmlDocument xml = new XmlDocument();
   xml.Load(cmd.ExecuteStream());
...
}

Скрипт 9

Обратите внимание на разное именование параметра в XPath-запросе и в параметрах объекта команды. Если посмотреть, во что XPath превращается на сервере:

exec sp_executesql N' SELECT ContactName FROM Customers WHERE ContactName>=@НачБуква ', N'@НачБуква nvarchar(1)', N'X',

то видно, что первая @ автоматически получается из $ при переводе XPath-запроса в SQL, а о второй нужно позаботиться самим в приложении (SqlXmlParameter.Name), иначе sp_executesql его попросту не поймет.
Кроме того, из результатов видно, что возвращать нормальный XML в ответ на прямой XPath-запрос SQL Server не умеет - результатом может быть только скалярная строка - например, одно поле единственной записи recordset'a. Если записей, паче чаяния, оказывается несколько, строки конкатенируются в одну. Прямые запросы исповедуют стандартную схему: таблицы воспринимаются как элементы, а поля - как атрибуты. Эти и другие серьезные ограничения наводят на мысль о том, что нужен специальный механизм, позволяющий задавать XML-представление над объектами базы данных, подобно тому, что мы наблюдали в случае ADO.Net DataSet (см. пред. параграф). В SQL Server такая возможность тоже существует и называется "аннотированные схемы".

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

[Содержание]

Передача логинов и паролей между SQL серверами

По материалам статьи Microsoft: INF: How To Transfer Logins and Passwords Between SQL Servers (Q246133)

Информация в этой статье относится к Microsoft SQL Server 7.0/2000 (все издания)

После перемещения базы данных в другой сервер, пользователи прежнего SQL сервера не смогут подключиться к новому серверу. Это происходит потому, что на новом сервере отсутствуют логины этих пользователей и их необходимо восполнить. В статье Microsoft Q246133 предлагается решение, которое позволяет упростить процедуру передачи логинов на другой сервер и описываются наиболее типичные проблемы, которые при этом могут возникнуть.
Если после перемещения базы данных на другой сервер Вы получите следующее сообщение об ошибке:

   Msg 18456, Level 16, State 1
   Login failed for user '%ls'.

Вы должны передать логины и пароли на новый сервер.

[Содержание]

Передача логинов и паролей между серверами SQL Server 7.0

SQL Server 7.0 Data Transformation Services (DTS) Object Transfer позволяет передавать логины и пользователей между двумя серверами, но не предусматривает передачу паролей для аутентифицированных SQL Server логинов. Чтобы передавать логины и пароли одного SQL Server 7.0 на другой, можно использовать представленную ниже хранимую процедуру sp_help_revlogin. Эта процедура создаёт сценарий, который может быть выполнен на новом сервере, где будут созданы логины с правильными SID и с установленными, прежними паролями.

[Содержание]

Передача логинов и паролей между серверами SQL Server 7.0 и SQL Server 2000 или между SQL Server 2000 серверами

Чтобы передать логины и пароли SQL Server 7.0 на какой-нибудь экземпляр SQL Server 2000, или между двумя экземплярами SQL Server 2000, можно использовать новый DTS Package Transfer Logins Task, входящий в комплект SQL Server 2000. Для этого нужно:

1. Подключитесь к SQL Server 2000, на который необходимо перенести логины с паролями, и используйте Data Transformation Services входящий в поставку SQL Server Enterprise Manager, разверните папку с таким же именем в дереве нового сервера и щёлкните правой кнопкой мыши по Local Packages, а затем выберете New Package.
2. После того, как появиться окно мастера DTS, щёлкните по Transfer Logins Task из меню Task. Укажите необходимую информацию о серверах во вкладках Source, Destination и Logins. Если Вы импортируете логины из SQL сервера, который находится на другом компьютере, необходимо, что бы экземпляр нового SQL сервера запускался из под учётной записи домена.

ОБРАТИТЕ ВНИМАНИЕ: Вы можете использовать метод с DTS или представленный ниже сценарий для передачи логинов между SQL Server 7.0 и SQL Server 2000, или между разными экземплярами SQL Server 2000. Метод DTS может передать пароли, но не может передать оригинальные SID. Если логин будет создан с отличным от оригинала SID и пользовательские базы данных также будут перемещены на новый сервер, связь между пользователями базы данных и её логинами будет утеряна. Для передачи оригиналов SID и предотвращения утери связи между пользователями и логинами, используйте представленный ниже сценарий вместо метода DTS.

[Содержание]

Скрипт перемещения логинов с паролями и оригинальными SID между SQL серверами

До применения представленного в этой главе скрипта, ознакомьтесь с находящимися в конце статьи рекомендациями, которые представляют важные замечания и дополнения к способам применения предлагаемых в настоящей статье способов переноса логинов, паролей и SID между SQL серверами.

1. Выполните представленный ниже скрипт на SQL сервере с которого необходимо перенести логины. Этот скрипт создаёт два хранимых процедуры с именами sp_hexadecimal и sp_help_revlogin в системной базе данных master. После успешного исполнения скрипта, выполните операции из пункта 2.

ОБРАТИТЕ ВНИМАНИЕ: Создаваемые в процессе исполнения скрипта процедуры напрямую оперируют с системными таблицами SQL Server. Структура этих таблиц может изменяться от версии к версии SQL Server, что может повлиять на работоспособность этого скрипта.


----- Begin Script, Create sp_help_revlogin procedure -----

USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
  DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
    @binvalue varbinary(256),
    @hexvalue varchar(256) OUTPUT
AS
DECLARE @charvalue varchar(256)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
  DECLARE @tempint int
  DECLARE @firstint int
  DECLARE @secondint int
  SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
  SELECT @firstint = FLOOR(@tempint/16)
  SELECT @secondint = @tempint - (@firstint*16)
  SELECT @charvalue = @charvalue +
    SUBSTRING(@hexstring, @firstint+1, 1) +
    SUBSTRING(@hexstring, @secondint+1, 1)
  SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
  DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name    sysname
DECLARE @xstatus int
DECLARE @binpwd  varbinary (256)
DECLARE @txtpwd  sysname
DECLARE @tmpstr  varchar (256)
DECLARE @SID_varbinary varbinary(85)
DECLARE @SID_string varchar(256)

IF (@login_name IS NULL)
  DECLARE login_curs CURSOR FOR
    SELECT sid, name, xstatus, password FROM master..sysxlogins
    WHERE srvid IS NULL AND name <> 'sa'
ELSE
  DECLARE login_curs CURSOR FOR
    SELECT sid, name, xstatus, password FROM master..sysxlogins
    WHERE srvid IS NULL AND name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
IF (@@fetch_status = -1)
BEGIN
  PRINT 'No login(s) found.'
  CLOSE login_curs
  DEALLOCATE login_curs
  RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated '
  + CONVERT (varchar, GETDATE()) + ' on ' + @@ServerNAME + ' */'
PRINT @tmpstr
PRINT ''
PRINT 'DECLARE @pwd sysname'
WHILE (@@fetch_status <> -1)
BEGIN
  IF (@@fetch_status <> -2)
  BEGIN
    PRINT ''
    SET @tmpstr = '-- Login: ' + @name
    PRINT @tmpstr
    IF (@xstatus & 4) = 4
    BEGIN -- NT authenticated account/group
      IF (@xstatus & 1) = 1
      BEGIN -- NT login is denied access
        SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''
        PRINT @tmpstr
      END
      ELSE BEGIN -- NT login has access
        SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''
        PRINT @tmpstr
      END
    END
    ELSE BEGIN -- SQL Server authentication
      IF (@binpwd IS NOT NULL)
      BEGIN -- Non-null password
        EXEC sp_hexadecimal @binpwd, @txtpwd OUT
        IF (@xstatus & 2048) = 2048
          SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')'
        ELSE
          SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')'
        PRINT @tmpstr
 EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
        SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
          + ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = '
      END
      ELSE BEGIN
        -- Null password
 EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
        SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
          + ''', NULL, @sid = ' + @SID_string + ', @encryptopt = '
      END
      IF (@xstatus & 2048) = 2048
        -- login upgraded from 6.5
        SET @tmpstr = @tmpstr + '''skip_encryption_old'''
      ELSE
        SET @tmpstr = @tmpstr + '''skip_encryption'''
      PRINT @tmpstr
    END
  END
  FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
  END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO

----- End Script -----

2. После того, как будет создана хранимая процедура sp_help_revlogin, запустите эту процедуру в Query Analyzer на исходном сервере:


   EXEC master..sp_help_revlogin

Хранимая процедура sp_help_revlogin может использоваться и на SQL Server 7.0 и на SQL Server 2000. Результат, выводимый sp_help_revlogin, представляет собой готовый скрипт, который создаёт логины с оригинальными SID и паролям. Сохраните выведенный в окно результатов исполнения скрипта текст, и затем выполните его как скрипт в Query Analyzer на том SQL сервере, куда необходимо перенести логины

[Содержание]

Рекомендации

1. Внимательно проанализируйте создаваемый процедурой скрипт прежде, чем запустить его на SQL сервере, куда необходимо передать логины. Если Вы должны передать NT логины на SQL сервер в другом домене, отредактируйте сгенерированный процедурой sp_help_revlogin скрипт и замените имя старого домена новым именем доменом во всех инструкциях sp_grantlogin. Поскольку логины в новом домене не будут иметь тот же самый SID как у логинов в старом домене, связь пользователей базы данных с логинами будет нарушена. Чтобы решать этих осиротевших пользователей, см. статьи, упомянутые ниже. Если Вы передаете NT логины между SQL серверами в одном домене, будет использоваться тот же самый SID, и пользователь не должны потерять связь со своими логинами.
2. После того, как логины будут перемещены, пользователи не будут иметь прежних разрешений по доступу к перемещённой базе данных. Эта проблема известна как "orphaned user". Если Вы попытаетесь предоставить логину доступ к базе данных, это может окончиться неудачей, с сообщением, что пользователя уже существует:

   Microsoft SQL-DMO (ODBC SQLState: 42000) Error 15023: User or role '%s' already exists in the current database.

Для получения инструкций о том, как разрешать проблему таких "осиротевших" пользователей, изучите указанные ниже статьи Microsoft Knowledge Base. Для осиротевших SQL и NT логинов, см. статью:

   INF: How to Resolve Permission Issues When a Database is Moved (Q240872)

Для получения информации о применении хранимой процедуры sp_change_users_login, которая перепривязывает к логинам осиротевших пользователей (это касается только пользователей, потерявших связь со стандартными SQL логинами), изучите следующую статью:

    PRB: Troubleshooting Orphaned Users Topic in BOL Incomplete (Q274188)

3. Такой подход становиться возможным из-за параметра @encryptopt в системной хранимой процедуре sp_addlogin, которая создаёт логин, используя зашифрованный пароль. Для получения дополнительной информации об этой процедуре, см. тему в SQL Server Books Online: "sp_addlogin (T-SQL)".
4. По умолчанию, только члены серверной роли sysadmin имеют право давать разрешение на выборку из таблицы sysxlogins. Если член роли sysadmin не предоставит необходимые разрешения, конечные пользователи не смогут создавать или выполнять эти хранимые процедуры.
5. Представленный выше подход не передаёт информацию о заданной по умолчанию базе данных для каждого логина, так как заданная по умолчанию база данных может быть иной на новом сервере. Чтобы установить заданную по умолчанию базу данных для логинов, используйте системную хранимую процедуру sp_defaultdb, указывая для неё в качестве параметров имя логина и заданную для него по умолчанию базу данных. Для получения подробной информации об использовании этой процедуры, см. в SQL Server Books Online тему: "sp_defaultdb".
6. В процессе передачи логинов между SQL серверами, если порядок сортировки исходного сервера - case-insensitive, а порядок сортировки нового сервера - case-sensitive, Вам придётся вводить на новом сервер все алфавитные символы в паролях в верхнем регистре.
7. Если порядок сортировки исходного сервера - case-sensitive, а порядок сортировки нового сервера - case-insensitive, Вы не сможете зарегистрироваться под перемещёнными логинами после использования процедуры, описанной в этой статье, если первоначальные пароли не содержали никаких алфавитных символов или если все алфавитные символы в первоначальных паролях были символами в верхнем регистре. Если оба сервера - case-sensitive или оба сервера - case-insensitive, у Вас не должно возникнуть таких проблем. Это побочный эффект механизма, с помощью которого SQL сервер обрабатывает пароли. Для получения дополнительной информации, см. тему в SQL Server 7.0 Books Online: "Effect on Passwords of Changing Sort Orders"
8. Если выполнять сгенерированный процедурой sp_help_revlogin скрипт на сервере, где уже заведены логин с такими же именами, как у логинов в этом скрипте, будет получена ошибка:

   Server: Msg 15025, Level 16, State 1, Procedure sp_addlogin, Line 56
   The login 'test1' already exists.

Аналогично, если на новом сервере уже существуют логин с тем же самым SID, Вы получите ошибку:

   Server: Msg 15433, Level 16, State 1, Procedure sp_addlogin, Line 93
   Supplied parameter @sid is in use.

По этой причине, очень важно тщательно изучить содержимое сгенерированного скрипта и таблицы sysxlogins, что бы иметь возможность внести в его текст соответствующие изменения.
9. Значение SID для логина используется, как основание для доступа к базе данных SQL Server. Поэтому, если один логин имеет два разных SID (для двух разных база данных на одном сервере), этот логин будет иметь доступ только к той базе данных, чей SID соответствует значению в syslogins для этого логина. Такая ситуация может возникнуть, если эти две базы данных были объединены с двух разных серверов. Чтобы разрешить эту проблему, такой логин необходимо удалить из базы данных, что бы избавиться от несоответствия SID, используя хранимую процедуру sp_dropuser и добавить его снова, используя хранимую процедуру sp_adduser.

[Содержание]

ССЫЛКИ НА СТАТЬИ

Новые технические статьи Microsoft

INF: Statistics Used by the Query Optimizer in Microsoft SQL Server 2000 (White Paper) (Q322096)
INF: Using SQL Server 2000 to Build Database Applications in Visual Studio .NET (White Paper) (Q322334)
INF: International Features in Microsoft SQL Server 2000 (White Paper) (Q322100)
INF: ADO.NET Primer (White Paper) (Q322331)
INF: C#: A SQL Server XML and ASP.NET Run-time Application (White Paper) (Q322333)
INF: SQL Server 7.0 Distributed Queries: OLE DB Connectivity (White Paper) (Q322611)
PRB: BobMgr::GetBuf() Errors May Be Registered in the SQL Server Error Log (Q309392)
INF: SQL Server 7.0 Features Guide (White Paper) (Q322881)
HOWTO: Install an MSMQ Independent Client on a Cluster After SQL Server 7.0 (Q237458)
INF: How To Install DTS Event Handlers In Visual Basic (Q221193)
INF: Bitmaps in Microsoft SQL Server 2000 (White Paper) (Q322099)
INF: Using COM Interfaces to Expand DTS Functionality (White Paper) (Q323047)
FIX: Unexpected Close of a SQL Server Connection May Lead to an Access Violation (Q323118)
BUG: The SELECT Statement with Parallelism Enabled May Cause an Assertion (Q311104)
INF: Choosing an Edition of SQL Server 2000 (White Paper) (Q322353)
PRB: Errors 3437, 3414, and "Could Not Connect to DTC" Occur When You Start SQL Server (Q306366)
INF: Choosing How to License SQL Server (White Paper) (Q322354)
INF: Exposing SQL Server Data to the Web with XML (White Paper) (Q322615)
BUG: Excel Mode Function Returns #ERR in MDX Calculated Member (Q322965)
INF: XML for Analysis Specification (White Paper) (Q322226)
INF: Microsoft SQL Server 2000 Distributed Queries: OLE DB Connectivity (White Paper) (Q322227)
INF: Embedding MSDE 2000 Setup into the Setup of Custom Applications (White Paper) (Q322228)
INF: Microsoft SQL Server 2000 as a Dimensionally Friendly System (White Paper) (Q322071)
INF: Accessing Heterogeneous Data with SQL Server 7.0 (White Paper) (Q322351)
HOW TO: Change Domains for a SQL Server 2000 Failover Cluster (Q319016)
INF: Using Partitions in a SQL Server 2000 Data Warehouse (White Paper) (Q322095)
INF: Readpipe Return Codes (Q110905)
INF: Moving SQL Server Databases to a New Location with Detach/Attach (Q224071)
SAMPLE: Mfceqado.exe Shows How to Use English Query with MFC and ADO (Q229612)
INF: How to Establish Encrypted Multiprotocol Connections with SQL 7.0 (Q239894)
FIX: SQL Server Components that Access the Registry in a Cluster Environment May Cause a Memory Leak (Q253738)
FIX: Error Message 602 Occurs When You Query a Temporary Table That Has a Non-Clustered Index (Q269282)
BUG: SQL Server 2000 Changes Name of RETURN_VALUE to @RETURN_VALUE (Q285295)
INF: Performance Considerations for an Upgrade from SQL Server 6.5 (Q297864)
FIX: ConnectionWrite Error When You Use Lightweight Pooling (Q303120)
INF: Moving SQL Server 7.0 Databases to a New Server with BACKUP and RESTORE (Q304692)
PRB: SQLAGENT Job Waiting on Worker Thread (Q306457)
PRB: Common Causes of Error Message 844 or Error Message 845 (Buffer Latch Time Out Errors) (Q310834)
BUG: sp_resolve_logins Stored Procedure Fails If Executed During Log Shipping Role Change (Q310882)
PRB: Unsecured SQL Server with Blank (NULL) SA Password Leaves Vulnerability to a Worm (Q313418)
FIX: Uppercase Characters Are Not Sorted Before Lowercase Characters with the Nocasepref Sort Order (Q319694)
HOW TO: Connect to Microsoft Desktop Engine (Q319930)
INF: Diagnosing and Troubleshooting Slow Partitioned Merge Replication Processes IWhite Paper) (Q322233)

[Содержание]

#099<<  #100

Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру Гладченко на адрес: mssqlhelp@pisem.net

sql.ru

Описание рассылки
 Поиск на SQL.RU
Искать: 
Результатов на странице: Формат:
Тип запроса: Раздел:
МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное