Microsoft SQL Server - вопросы и ответы

Источник: business-process

Вопрос:
При запуске фильтра в утилите Profiler (MS SQL 7.0) выдается сообщение об ошибке: "SQL Profiler is unable to connect: cannot obtain registered server information or server is registered to prompt for password which is not supported (SQL Profiler не может осуществить конннект: не может получить информацию о параметрах регистрации сервера или сервер зарегистрирован так, чтобы запрашивать пароль - а это не поддерживается". Что делать?

Ответ:
Возможно в параметрах регистрации SQL сервера (в утилите Enterprise Manager) указана опция Always prompt to for login name and password (Всегда запрашивать имя логина и пароль). Необходимо отключить эту опцию.

Вопрос:
При проверке базы данных (команда DBCC) была найдена ошибка 614 (Msg. 614 A row on page 092345667 was accessed that has an illegal length of 100 in database DemoXMB'). Что это за ошибка и как ее можно исправить?

Ответ:
Эта ошибка происходит, когда идет попытка обращения к строке на странице, фактическая длина которой (строки) больше ожидаемой. Это говорит о том, что имеется проблемы с внутренней структурой базы данных. Прежде чем исправлять эту ошибку, необходимо выполнить инструкции DBCC CHECKDB и DBCC NEWALLOC. Если находятся еще какие-то ошибки, то сначала исправить их. Если нет других ошибок, то нужно определить, какому объекту принадлежит страница (как определить объект по странице см. SQL Server Books Online Chapter 24."Additional Problem Solving Techniques."). Если страница связана с индексом, иногда можно решить проблему, удаляя и пересоздавая индекс. Если это данные не системной таблицы, попытайтесь скопировать полностью данные из таблицы в другую таблицу, удалить таблицу, пересоздать ее и затем скопировать данные назад в таблицу. Если это данные из системной таблицы, то выполнить перенос данных на другую базу данных. Для более подробной информации об этой ошибке см. SQL Server Books Online.
Еще один способ решения проблем, связанных с нарушением внутренней структуры БД - выполнять transfer баз данных в другие базы данных.

Вопрос:
Что будет, если на MS SQL 7.0 в базу данных (БД1) размером 100x100 Мб (данные и журнал транзакций) попытаться восстановить из backup базу данных (БД2) размером 200х200 Мб?

Ответ:
Восстановление пройдет успешно, и размеры базы данных БД1 установятся в 200х200 Мб. Если же размеры базы данных БД1 будут больше, чем у БД2, то произойдет их уменьшение. Таким образом, при восстановлении данных из backup размеры базы данных устанавливают в те, которые были у базы данных находящейся в backup.

Вопрос:
Почему файл со скриптом не полностью загружается в редактор SQL Analyzer (ISQL/W), хотя при просмотре прочими средствами (например, в Far'е) видно его полностью?

Ответ:
Возможно, в теле файла встречается символ конца файла (#27, 0x1B). SQL Analyzer читает файл полностью, но в окно редактора выводит только текст до символа конца файла. Решение: просто удалить этот символ из текста скрипта (он выглядит, как стрелка влево)

Вопрос:
Как узнать, с каким Service Pack установлен MS SQL Server 6.5 или MS SQL Server 7.0?

Ответ:
Для MS SQL Server 6.5 нужно запустить SQL Enterprise Manager, выбрать сервер и открыть окно его свойств (меню Configure.. по правой клавише мыши). В этом окне перейти на закладку Attribute и посмотреть значение параметра ProductVersion.
В выданном результате посмотреть значение поля Character_Value.
Ниже приведена расшифровка этого значения для MS SQL Server 6.5:
6.50.201 Original SQL Server 6.5 release
6.50.213 SQL Server 6.5 with Service Pack 1
6.50.240 SQL Server 6.5 with Service Pack 2
6.50.258 SQL Server 6.5 with Service Pack 3
6.50.281 SQL Server 6.5 with Service Pack 4
6.50.415 SQL Server 6.5 with Service Pack 5
6.50.416 SQL Server 6.5 with Service Pack 5a
Для MS SQL Server 6.5 или MS SQL Server 7.0   выполнить следующую команду в ISQL\w ( Query Analyzer) :
xp_msver ProductVersion.
Ниже приведена расшифровка этого значения для MS SQL Server 7.0:
         7.00.842 SQL Server 7.0 with Service Pack 2
А можно еще проще - в ISQL\w или в MS Query Analyzer выполнить команду:
select @@VERSION
В первой строке показывается номер версии с учетом Service Pack.

Вопрос:
Запускаю SQL Enterprise Manager, открываю БД и пытаюсь удалить таблицу. Но выдается сообщение об ошибке
"Cannot drop the AdminKAS.tmpDoc with object-id 1234434 in database HBBaseXMB, because it doesn't exist in the system catalogs."
Как удалить такую таблицу ?

Ответ:
Чтобы удалить эту таблицу, нужно просто удалить ее из системной таблицы Sysobjects. Например, таким образом:
delete from sysobjects   where name='tmpDoc' and uid=user_id('AdminKAS'). Предварительно необходимо разрешить изменять системные объекты.

Вопрос:
При попытке на MS SQL Servr 7.0 восстановить backup, созданный на другой backup БД, выдается сообщение об ошибке, хотя размеры БД совпадают. Что делать?

Ответ:
При восстановлении в другую БД необходимо в диалоге "Restore database" на закладке "Option" отметь галочку "Force restore over existing database" и в таблице "Restore datavase files as:" в колонке "Restore as" указать пути и имена файлов БД, В КОТОРУЮ происходит восстановление.

Вопрос:
Принес backup БД с другого сервера, но восстановить не могу. Ругает на сортировку. Как узнать какие установки сервера надо задать, чтобы восстановить из backup.

Ответ:
Для успешного восстановления из backup необходимо точное совпадение установок сортировки. Изменить эти установки можно, только перестроив БД master.
Чтобы посмотреть текущие установки можно воспользоваться хранимой процедурой sp_helpsort или sp_configure.
ХП sp_helpsort показывает:
   · Character Set - кодовая страница;
   · Code Page - id   кодовой страница;
   · Sort Order - тип сортировки (словарная или нет, чувствительная к регистру или нет);
   · Characters, in Order - показывает, в каком порядке будут сортироваться символы из набора.
MS SQL Server 7.0 дополнительно имеет характеристики сортировки UNICODE-овых данных (Unicode data sorting):
   · Locale ID - id выбранного Unicode;
   · Case insensitive - нечувствительность к регистру (case sensitive - флажок не установлен);
   · Accent-insensitive - нечувствительность к диакритическому знаку (если не показывается - флажок не установлен);
   · Width insensitive - нечувствительность к ширине (если не показывается - флажок не установлен);
   · Kana type insensitive - нечувствительность к типу Kana (если не показывается - флажок не установлен).
ХП sp_configure показывает:
   · default sortorder id - определяет набор символов, порядок сортировки и кодовую страницу.
MS SQL Server 7.0 дополнительно имеет характеристики сортировки UNICODE-овых данных:
   · Unicode locale id -   id выбранного Unicode;
   · Unicode comparison style - определяет четыре установки сопоставления Unicode.

Вопрос:
При перестроении индексов на сервере MS SQL 6.5 выдается сообщение (№1204) о том, что превышено максимально допустимое количество блокировок. Причем увеличение значения параметра locks в конфигурации сервера не помогает (15000). Как сделать чтобы все было нормально?

Ответ:
Причина, скорее всего, в том, что на сервере MS SQL 6.5 не установлен Service Pack 4. После его установки должно быть все нормально.   MS SQL 6.5 без SP4 не умеет поднимать уровень блокировок, он выполняет их на очень низком уровне и поэтому ему не хватает отведенного количества.

Вопрос:
На SQL Server 7.0. замечено, что одна   таблица может занимать очень много места (например, 50 Mb), но на самом деле в ней мало полей и   записей, т.е. размер не соответствует содержимому. Из-за чего это происходит и как привести размеры таблицы в соответствии с ее содержимым ?

Ответ:
Дело в том, что у SQL Server есть очень нехорошая особенность - он хранит удаленные записи в таблице. Т.е. он не удаляет физически записи из таблицы, а просто помечает их как удаленные. Это сделано для того, чтобы не забивать лог при удалении записей. Поэтому, если из таблицы активно удаляют и добавляют записи по много раз, то она разрастается до неприличия.
Существует три способа привести размеры таблиц в соответствие с их содержимым:
1. Самый лучший, но не самый быстрый способ - это произвести трансфер БД, помимо того, что он приведет в соответствие размеры таблиц, он еще сделает много хороших вещей (переиндексация, обновление статистики и т.д.) и может исправить много ошибок.
2. Использовать инструкцию DBCC SHRINKDATABASE (DemoXMB, 5, NOTRUNCATE) - не очень эффективный способ, но в определенной степени помогает.
3. Использовать специальную ХП.
    Ограничения:
       1. ХП не будет работать, если у таблицы есть IDENTITY поля.
       2. И ее нельзя выполнять на таблицах с ТРИГГЕРАМИ.
    Достоинства:
       1.Скорость выполнения, по сравнению с другими способами.
       2.Возможность выполнять в автоматическом режиме, через задания.
       3.Решение проблемы соответствия размеров на конкретной таблице в БД.
Текст ХП приведен ниже:
            CREATE PROCEDURE MBShrink_table
               @NameTbl varchar(30),   -- имя таблицы (обязательное)
               @DB varchar(30) = null -- имя БД (обязательное)
            AS
            begin
            -- удалим временную таблицу
            execute('
            if exists (select *
                               from sysobjects (nolock)
                               where id = object_id("'+@DB+'..'+@NameTbl+'1")
                                  and sysstat & 0xf = 3)
                           drop table '+@DB+'..'+@NameTbl+'1')
            -- включим опцию вставки записей напрямую
            exec('master..sp_dboption @dbname= "'+@DB+'",@optname="select into/bulkcopy",
                                                   @optvalue ="TRUE"')
            -- перенесем данные во временную таблицу
            exec('select * into '+@DB+'..'+@NameTbl+'1 from '+@DB+'..'+@NameTbl)
            -- очистим оригинал-таблицу
            exec('truncate table '+@DB+'..'+@NameTbl)
            -- перенесем данные обратно
            exec('insert into '+@DB+'..'+@NameTbl+'
                        select * from '+@DB+'..'+@NameTbl+'1')
            -- удалим временную таблицу
            execute('
            if exists (select *
                      from sysobjects (nolock)
                      where id = object_id("'+@DB+'..'+@NameTbl+'1")
                         and sysstat & 0xf = 3)
            drop table '+@DB+'..'+@NameTbl+'1')
            -- отключим опцию вставки записей напрямую
            exec('master..sp_dboption @dbname= "'+@DB+'",@optname="select into/bulkcopy",
                                                   @optvalue ="FALSE"')
            end

Вопрос:
В MS SQL 7.0 появилась назначать несколько шагов (steps) для заданий (jobs), выполняемых по расписанию. Можно ли, задать несколько действий так, чтобы они выполнялись параллельно.

Ответ:
Нет.

Вопрос:
На SQL Server 7.0 не запускается Query Analyser, некорректно работает Enterprise Manager - выдаются сообщения об ошибке в ODBC источнике (некорректная версия драйвера и самого ODBC). Почему это произошло ? Как сделать так чтобы все работало нормально ?

Ответ:
Драйверы ODBC и сам ODBC может "испортить" какая-нибудь другая программа, которая ставилась на сервере. Например, если установить Crystal Reports 6.0, не убрав при   его установке установку ODBC драйверов, то он установит старые драйвера для SQL Server.
Найден пока только один способ, чтобы это исправить. Предварительно нужно сделать backup'ы баз данных и записать их размеры. Переустановить SQL Server 7.0., а затем создать БД с такими же размерами и восстановить их из   backup'ов.

Вопрос:
Как включить/отключить показ системных таблиц в Enterprise Manager в MS SQL 7.0?

Ответ:
Щелкните правой клавишей мыши на имени сервера в Enterprise Manager и выберите Edit SQL Server Registration Properties. Поставьте/снимите метку в окошке напротив надписи Show system databases and objects.

Вопрос:
Пользователь забыл пароль для входа в КАС "Бизнес Люкс". Что делать?

Ответ:
Придется зайти в Enterprise Manager и опустошить там пароль пользователя. После этого пользователю необходимо задать свой пароль через службу паролей.

Вопрос:
При попытке запустить отчет в "КАС Бизнес Люкс" (используется MS SQL Server 6.5) выдается сообщение об ошибке 7134. В чем дело ?

Ответ:
Скорее всего, MS SQL Server 6.5 установлен совместно с Service Pack 3. Необходимо установить Service Pack 4.

Вопрос:
На MS SQL Server 7.0 SP2 существовала БД с владельцем, отличным от sa. В нее восстановил БД принесенную с другого сервера. Теперь эта БД не доступна владельцу. Как вернуть доступ владельцу БД?

Ответ:
Придется запустить Query Analyzer от имени sa и поменять владельца БД командой:
sp_changedbowner <Имя_нового_владельца>
Возможно, придется предварительно удалить всех пользователей из БД командами:
sp_dropuser <Имя_пользователя>

Вопрос:
На MS SQL Server 7.0 восстановил БД, принесенную с другого сервера. Пытаюсь добавить в нее пользователя - говорит, что такой уже есть. Хотя в списке пользователей через Enterprise Manager такого пользователя в БД нет. В чем дело?

Ответ:
Сначала теория. Каждый пользователь в БД свой внутренний код (UID) и еще имеет ссылку на определенный login. Ссылка эта, по сути, представляет некий внутренний код (SUID). Список пользователей в БД привязан к конкретной БД и сохраняется в backup (вместе с SUID login-а!). А SUID login-ов на каждом сервере свои. Таким образом, получается, что пользователь из восстановленной БД ссылается на несуществующий login. А Enterprise Manager в MS SQL 7.0 SP2, в отличие от MS SQL 6.5, не показывает пользователей, для которых потеряна ссылка на login. Чтобы исправить положение, необходимо удалить пользователей в восстановленной БД с помощью команды:
sp_dropuser <Имя пользователя>.
Узнать полный список пользователь в БД можно, выполнив команду:
select name from sysusers where suid is not null

Вопрос:
Как изменить владельца БД?

Ответ:
Для изменения владельца БД, необходимо выполнить хранимую процедуру:
sp_changedbowner <имя нового владельца>
подключившись при этом к нужной БД.
Небольшое замечание - новый владелец не должен присутствовать в БД как ее пользователь

Вопрос:
После загрузки сервера некоторые БД оказались помеченными как suspect. Что случилось и как можно вернуть эти БД? Использовался MS SQL Server 6.5.

Ответ:
Часто такое бывает, когда SQL-сервер теряет расположение файлов, в которых размещены database devices. Причем происходит так, что SQL-серверу достаточно потерять путь dat-файлам только один раз - он сразу помечает БД как suspect. После этого, даже если вернуть прежние пути к файлам, база данных будет помечена как suspect. Потеря файла может произойти, например, по следующим причинам:
• были переименованы (удалены) каталоги и/или файлы;
• изменились логические буквы разделов дисков. Такое может произойти, например, когда на сервер устанавливается новый HDD. В этом случае обычно буквы дисков, начиная с D: меняются, а т.к. MSSQLServer автоматически загружается, то он теряет файлы.
Для исправления ситуации необходимо восстановить пути к файлам, в которых размещались database devices (не путать с backup!). После этого в БД master необходимо создать хранимую процедуру sp_resetstatus. Текст этой процедуры можно найти в SQL Server Books Online, поискав статью "Resetting the Suspect Status".
Перед использованием этой ХП необходимо разрешить прямое изменение системных таблиц:
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
Для сброса признака suspect выполняем в БД master ХП sp_resetstatus:
sp_resetstatus 'DataBaseName'
go
А теперь запретим прямое изменение системных таблиц:
sp_configure 'allow updates',0
go
reconfigure with override
go
Теперь можно перезагрузить SQL Server. Если после перезагрузки состояние suspect не исчезло - придется восстанавливать из backup :(

Вопрос:
Возникла ошибка 'Stored procedure '' not found'. Что делать?

Ответ:
Это часто бывает после изменения структуры таблицы или после неудачного перегенерирования ХП и триггеров. Надо перегенерировать триггеры и ХП.

Вопрос:
Почему при запуске Performance Monitor на Windows NT Server в списке контролируемых объектов ничего нет, или есть только по SQL Server-у?

Ответ:
Виноваты   Regional   Settings   и   отсутствие   пользователя probe.   Поподробнее -   SQL   Server   для слежения   за своей работой   использует   пользователя   probe,   БД по умолчанию (default)   для которого   должна быть   master. Если   такого пользователя нет,   то объекты SQL   Server не показываются. Объекты   Windows   NT   могут   не   показываться по следующей причине - возможно   в   Control   Panel->Regional Settints установлено Russian. Исправить можно так. Ставим Russian и включаем флажок   "Set as system   default locale". Нажимаем Ok (здесь   может попросить перезагрузиться   - согласимся с ней). После перезагрузки   идем туда   же и   ставим Englidh (United States), но флажок "Set as system default locale" должен быть выключен. В результате у нас установлены русские   шрифты, можем писать   по-русски, а Performance Monitor работает.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=25014