Изменения в работе функций компонента Database Engine в SQL Server 2005
Изменения: 17 июля 2006 г.
Этот раздел описывает изменения в работе некоторых функций компонента Database Engine в Microsoft SQL Server 2005 по сравнению с их работой в предыдущих версиях SQL Server.
Резервное копирование и восстановление
При восстановлении существующей базы данных SQL Server 2005 требуется создать резервную копированию заключительного фрагмента журнала, прежде чем приступить к восстановлению базы данных в соответствии с моделью полного восстановления или восстановления с неполным протоколированием. Попытка восстановить базу данных перед резервным копированием заключительного фрагмента журнала приведет к ошибке, если инструкция RESTORE не содержит предложения WITH REPLACE или WITH STOPAT. Дополнительные сведения по обновлению компонентов SQL Server см. в разделе Резервные копии заключительного фрагмента журнала.
Курсоры
В следующей таблице перечислены неявные преобразования курсора, которые имеют место в SQL Server 2000, но отсутствуют в SQL Server 2005. В качестве временного решения можно запросить определенный тип курсора, не опираясь на неявное преобразование.
Условие | В SQL Server 2000 курсор преобразуется из | В |
---|---|---|
Запрос содержит встроенную возвращающую табличное значение функцию. |
Динамический или набор ключей |
Статический |
Запрос ссылается на удаленный объект. |
Однопроходный |
Набор ключей |
Запрос не содержит таблиц. |
Однопроходный |
Статический |
Запрос содержит табличную функцию. |
Однопроходный |
Статический |
Запрос содержит производную таблицу. |
Однопроходный |
Статический |
Запрос содержит табличную функцию с несколькими инструкциями. |
Динамический Набор ключей |
Из «Динамического» в «Статический» Статический |
Запрос содержит виртуальную таблицу. |
Динамический или набор ключей |
Статический |
Запрос содержит представление с TOP. |
Однопроходный |
Статический |
Запрос содержит обновляемые секционированные представления. |
Однопроходный |
Статический |
Запрос курсора API содержит индексированное представление с уникальным путем доступа, но не на уровне базовой таблицы. |
Набор ключей |
Статический |
Запрос API-курсора содержит таблицу без кластеризованного индекса или уникального ключа. |
Набор ключей |
Статический |
Результирующий набор курсора API содержит столбец с типом данных text, ntext или image. |
Однопроходный |
Динамический |
SQL Server 2005 не поддерживает асинхронное формирование курсоров, управляемых набором ключей, и статических курсоров Transact-SQL. Операции курсора Transact-SQL, такие как OPEN или FETCH, обычно являются пакетными. Таким образом, нет необходимости в асинхронном формировании курсоров Transact-SQL. SQL Server 2005 продолжает поддерживать использование асинхронных курсоров, управляемых набором ключей, или статических серверных курсоров API в случаях, когда операция OPEN с малым периодом ожидания замедляется из-за двусторонних задержек клиента для каждой операции курсора.
Если в SQL Server 2005 динамический курсор объявлен для таблицы без уникальных индексов и строка удалена за пределами курсора, последующее обновление курсора извлекает местозаполнитель для строки со значением NULL. В более ранних версиях SQL Server курсор не возвращает затронутую строку.
Если в SQL Server 2005 внутри пакета или хранимой процедуры возможны различные объявления курсора посредством логики условий, инструкции INSERT, UPDATE и DELETE, выполняемые через курсор, влекут за собой повторную компиляцию. В SQL Server 2000 эти инструкции не вызывают повторную компиляцию.
В следующем примере использование инструкции UPDATE
приведет к повторной компиляции модуля.
IF(@some_condition=1)
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
ELSE
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
...
FETCH NEXT FROM c
...
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
Чтобы избежать повторной компиляции, перепишите код следующим образом:
IF (@some_condition=1)
BEGIN
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
ELSE
BEGIN
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
В SQL Server 2005 блокировки прокрутки курсоров вызывают преобразование блокировки с типа S (общая) на U (обновления), если в запросе не указана подсказка блокировки более высокого уровня. SQL Server 2000 автоматически добавляет подсказку блокировки типа U к блокировкам прокрутки курсоров. Правила работы курсоров в SQL Server 2005 предусматривают более эффективный параллелизм, однако существует вероятность образования взаимоблокировок (сообщение 1205) для параллельно выполняемых курсоров. Используйте подсказку UPDLOCK для обеспечения требуемого поведения. Дополнительные сведения по обновлению компонентов SQL Server см. в разделе Табличная подсказка (Transact-SQL).
В SQL Server 2000, когда обновляется значение столбца или строки, встречающееся в буфере выборки курсора более одного раза, обновление может не затронуть другие вхождения из-за размера буфера выборки или расположения строк в нем. В SQL Server 2005 строки в буфере выборки обновляются таким образом, что значения всегда согласованы, независимо от размера буфера выборки или расположения строк.
В SQL Server 2000 курсоры, использующие инструкцию UNION ALL, некорректно возвращают сведения о возможности обновления на основе первого набора в инструкции UNION. Следовательно, некоторые курсоры описываются как обновляемые, хотя они ими не являются. SQL Server 2005 представляет результаты инструкции UNION ALL как вычисляемые и, следовательно, необновляемые. Если все строки курсора исходят из одной таблицы или представления, можно определить курсор, обновляемый посредством изменения запроса для использования предложений IN или OR вместо UNION.
В SQL Server 2000, когда параметр CURSOR_CLOSE_ON_COMMIT установлен в значение ON, все курсоры в соединении закрываются при фиксации транзакции. В SQL Server 2005 во время фиксации транзакции закрываются только курсоры, открытые в пределах текущей транзакции. Курсоры, открытые до начала транзакции, остаются открытыми.
SQL Server 2000 позволяет выполнять ряд объявлений курсоров, которые не являются допустимыми, и преобразует их в другие типы курсоров. SQL Server 2005 не допускает использование недопустимых объявлений. Например, курсор, который запрашивает и обновляемость, и нечувствительность, не является допустимым и в SQL Server 2005 вызывает ошибку.
Базы данных, файлы данных и журналов
Поведение SQL Server 2000 | Поведение SQL Server 2005 |
---|---|
Параметр базы данных AUTO_CLOSE является синхронным процессом, который может снизить производительность, когда к базе данных обращается приложение, неоднократно устанавливающее и разрывающее соединения с Database Engine. |
Процесс AUTO_CLOSE является асинхронным. Повторяющиеся открытия и закрытия базы данных больше не снижают производительность. |
Файлы в необработанных секциях не растут автоматически, и, следовательно, параметры MAXSIZE и FILEGROWTH не требуются, если в параметре os_file_name указывается необработанная секция. |
Файлы в необработанных секциях растут автоматически. Можно указать параметры MAXSIZE и FILEGROWTH. |
Разрешения не устанавливаются для файлов данных и файлов журнала каждой базы данных. |
Разрешения устанавливаются для файлов данных и файлов журнала каждый раз, когда к базе данных применяются следующие операции:
СоздаетсяИзменена для добавления нового файла
ПрисоединенаСоздана резервная копия
ОтсоединениеВосстановление
|
Эти разрешения предотвращают случайное повреждение файлов, хранящихся в каталоге с открытыми разрешениями. Дополнительные сведения по обновлению компонентов SQL Server см. в разделе Защита данных и файлов журналов.
Примечание.
Microsoft SQL Server 2005 Express Edition не задает разрешения на файлы данных и файлы журнала.
Связанные серверы и распределенные запросы
Связанный сервер, который определялся использованием в качестве имени поставщика «SQLOLEDB», при обновлении будет изменен на «SQLNCLI» (собственный поставщик OLE DB клиента SQL). Представление совместимости sys.sysservers показывает связанные серверы, использующие SQLNCLI как SQLOLEDB. Представление каталога SQL Server 2005 sys.servers показывает связанные серверы, которые используют «SQLNCLI» в виде «SQLNCLI».
Гетерогенные запросы и использование поставщиков OLE DB не поддерживаются при выполнении SQL Server в режиме волокон. Режим волокон включается, если дополнительный параметр конфигурации lightweight pooling установлен в значение 1.
Экземпляр поставщика OLE DB для собственного клиента SQL нельзя создать вне процесса.
Предупреждающие сообщения от связанного сервера в SQL Server 2005 не передаются клиенту. Наиболее значимые классы таких предупреждений:
- Предупреждения в формате ANSI о том, что значения NULL исключены при вычислении статистической функции
- Предупреждения об арифметическом переполнении
Например, следующая инструкция Transact-SQL может сформировать предупреждающее сообщение, если существуют значения NULL в col1
:
SELECT SUM(col1)
FROM <Table>
GROUP BY col2
В SQL Server 2000 и более ранних версиях связанные серверы передавали предупреждающее сообщение клиенту. В SQL Server 2005 связанные серверы не передают предупреждающие сообщения.
В SQL Server 2000, если удаленная хранимая процедура выполняется неудачно из-за ошибок времени компиляции, таких как неправильная привязка параметров, возвращается значение или состояние, равное 0. Если такая ситуация имеет место в SQL Server 2005, в качестве возвращаемого значения или состояния устанавливается NULL.
Архитектура обработчика запросов
Использование значений параметра в течение повторной компиляции различается в SQL Server 2000 и SQL Server 2005 для пакетов, запущенных в следующих формах:
- Хранимые процедуры
- Использование sp_executesql
- Подготовленные инструкции
Когда SQL Server 2000 повторно компилирует эти пакеты, используются значения параметров, с которыми пакеты вызываются как часть повторной компиляции. Когда SQL Server 2005 повторно компилирует эти запросы, используются значения параметров, существовавшие до того, как инструкция вызывает повторную компиляцию. Эти значения могут отличаться от тех, которые первоначально были переданы в пакет. Дополнительные сведения по обновлению компонентов SQL Server см. в разделе Параметры и повторное использование планов выполнения.
Безопасность
Функция | Поведение SQL Server 2000 | Поведение SQL Server 2005 |
---|---|---|
GRANT ALL |
Предоставляет все применимые разрешения. |
Предоставление разрешения ALL на объекты и инструкции является устаревшим. Когда выполняется инструкция GRANT ALL происходит следующее:
SQL Server 2005 предоставляет дополнительные разрешения в различных областях, которые можно использовать для управления пользовательскими разрешениями. Например, разрешение CONTROL можно использовать для предоставления разрешений на объект, эквивалентных разрешениям его владельца. |
Сравнения паролей |
SQL Server 2000 поддерживает две версии каждого пароля, используемого для входа в SQL Server. Один — текущий пароль, предоставленный пользователем, а другой — пароль, преобразованный SQL Server в буквы верхнего регистра. Это делает доступной проверку подлинности паролей, не учитывающую регистр. Несмотря на то что это поведение удобно для многих пользователей, атаки путем подбора пароля становятся легче из-за снижения количества возможных паролей. |
Хранится только текущий пароль. Пароль, вводимый пользователем, должен совпасть с паролем, хранимым на сервере. Если пароль не совпадает с паролем, хранимым в SQL Server, вход не выполняется. Если забыт точный регистр символов пароля, пароль должен быть переустановлен. |
Смена языка по умолчанию для учетной записи sa |
Язык по умолчанию для учетной записи SQL Server sa — это язык, который выбран во время установки или обновления версии. В предыдущих версиях Microsoft SQL Server запуск хранимой процедуры sp_configure для смены языка сервера по умолчанию также обновлял язык по умолчанию для учетной записи sa. |
Чтобы изменить язык по умолчанию для учетной записи sa в SQL Server 2005, необходимо выполнить хранимую процедуру sp_defaultlanguage, затем команду DBCC FREESYSTEMCACHE, после чего начать новый сеанс. Запуск процедуры sp_configure для смены языка сервера по умолчанию не меняет языка по умолчанию для учетной записи sa. |
Системные хранимые процедуры
Следующие таблицы содержат список изменений параметров в системных хранимых процедурах Database Engine.
Хранимая процедура | Параметр | Описание изменения |
---|---|---|
sp_bindefault |
@objname |
Размер изменен с nvarchar(517) на nvarchar(776). |
sp_bindrule |
@objname |
Размер изменен с nvarchar(517) на nvarchar(776). |
sp_changeobjectowner |
@objname |
Размер изменен с nvarchar(517) на nvarchar(776). |
sp_detach_db |
@keepfulltextindexfile |
Размер изменен с nvarchar(517) на nvarchar(776). |
sp_fulltext_service |
@action |
Размер изменен с varchar(20) на nvarchar(100). |
sp_fulltext_service |
@value |
Тип данных изменен с int на sql_variant. |
sp_getapplock |
@DbPrincipal |
Добавлен параметр. |
sp_releaseapplock |
@DbPrincipal |
Добавлен параметр. |
sp_setapprole |
@fCreateCookie |
Добавлен параметр. |
sp_setapprole |
@cookie |
Добавлен параметр. |
sp_settriggerorder |
@stmttype |
Размер изменен с varchar(10) на varchar(50). |
sp_settriggerorder |
@namespace |
Добавлен параметр. |
sp_sproc_columns |
@fUsePattern |
Добавлен параметр. |
sp_stored_procedures |
@fUsePattern |
Добавлен параметр. |
sp_table_privileges |
@fUsePattern |
Добавлен параметр. |
sp_table_privileges_ex |
@fUsePattern |
Добавлен параметр. |
sp_tables |
@fUsePattern |
Добавлен параметр. |
sp_tables_ex |
@fUsePattern |
Добавлен параметр. |
Системные таблицы и представления
Следующие таблицы содержат список изменений в столбцах системных таблиц и представлений.
Системная таблица или представление | Столбец | Описание изменения |
---|---|---|
COLUMNS |
ORDINAL_POSITION |
Тип данных изменен с smallint на int. |
PARAMETERS |
ORDINAL_POSITION |
Тип данных изменен с smallint на int. |
REFERENTIAL_CONSTRAINTS |
MATCH_OPTION |
Размер изменен с varchar(4) на varchar(7). Значение по умолчанию изменено с «NONE» на «SIMPLE». |
REFERENTIAL_CONSTRAINTS |
UPDATE_RULE |
Размер изменен с varchar(9) на varchar(11). |
REFERENTIAL_CONSTRAINTS |
DELETE_RULE |
Размер изменен с varchar(9) на varchar(11). |
ROUTINE_COLUMNS |
ORDINAL_POSITION |
Тип данных изменен с smallint на int. |
sysaltfiles |
name |
Тип данных изменен с nchar(128) на sysname. |
sysaltfiles |
filename |
Тип данных изменен с nchar(260) на nvarchar(260). |
sysconfigures |
config |
Тип данных изменен с smallint на int. |
syscursorcolumns |
data_type_sql |
Тип данных изменен с smallint на int. |
sysfiles |
name |
Тип данных изменен с nchar(128) на sysname. |
sysfiles |
filename |
Тип данных изменен с nchar(260) на nvarchar(260). |
sysmessages |
severity |
Тип данных изменен с smallint на tinyint. |
sysperfinfo |
cntr_value |
Тип данных изменен с int на bigint. |
sysprocesses |
waittime |
Тип данных изменен с int на bigint. |
sysprocesses |
hostprocess |
Размер изменен с nchar(8) на nchar(10). |
sysprocesses |
request_id |
Добавлен столбец. |
sysprotects |
columns |
Размер изменен с varbinary(4000) на varbinary(8000). |
sysservers |
srvcollation |
Тип данных изменен с int на sysname. |
sysservers |
nonsqlsub |
Добавлен столбец. |
sysoledbusers |
rmtpassword |
Возвращает только значение NULL. |
sysindexes |
keys |
Возвращает только значение NULL. |
sysindexes |
statblob |
Возвращает только значение NULL. |
syscomments |
compressed |
Возвращает только 0. |
sysdevices |
size |
Возвращает только 0. |
sysobjects |
schema_ver |
Возвращает только 0. |
sysremotelogins |
status |
Возвращает только 0. |
sysservers |
topologyx |
Возвращает только 0. |
sysservers |
topologyy |
Возвращает только 0. |
Transact-SQL
Функция | Поведение SQL Server 2000 | Поведение SQL Server 2005 |
---|---|---|
Программа bcp |
Пользователь, который имеет для таблицы разрешения INSERT и SELECT, может использовать программу bcp для массовой загрузки данных в таблицу, используя следующую команду:
По умолчанию эта команда отключает ограничения CHECK и триггеры в целевых таблицах. |
Для запуска программы bcp пользователь должен иметь разрешение ALTER, а также разрешения INSERT и SELECT для целевых таблиц, если ограничения CHECK и триггеры отключены в течение процесса массового копирования. После обновления до SQL Server 2005 команды bcp в приложениях могут дать сбой из-за недостатка разрешений. Эта проблему можно решить одним из следующих способов:
|
Встроенные системные функции |
Каждое обращение к встроенным функциям, таким как NEWID и RAND, дает новый результат, потому что он вычисляется один раз для каждого обращения внешнего запроса. |
Внешний запрос создает несколько обращений к столбцам представлений или производных таблиц. Однако если эти столбцы определены вызовом таких функций как NEWID и RAND, эти несколько обращений являются причиной того, что эта функция вычисляется только один раз для каждого фактического вызова внутри представления или производной таблицы. Несколько обращений к таким столбцам во вложенном запросе не вызывают многократного вычисления функций. Это позволяет многократно использовать значение, вычисляемое этими функциями во вложенном запросе. Например в SQL Server 2000 следующий запрос возвращает два различных значения. В SQL Server 2005 этот запрос возвращает одно значение.
|
BULK INSERT |
Инструкция BULK INSERT поддерживает преобразование строкового типа в десятичный для строк, представляющих собой числовые значения, которые используют экспоненциальный формат. |
Преобразования строковых типов в десятичные, используемые в инструкции BULK INSERT, следуют тем же правилам, что и функция Transact-SQL CONVERT. Эта функция отклоняет строки, представляющие числовые значения, которые используют экспоненциальный формат. Следовательно, инструкция BULK INSERT считает такие строки недопустимыми значениями и сообщает об ошибках преобразования. Дополнительные сведения по обновлению компонентов SQL Server см. в разделе BULK INSERT (Transact-SQL). |
преобразования datetime |
Преобразования строк в datetime помечены как детерминированные. Однако это неверно для стилей, перечисленных в следующей таблице. Для этих стилей преобразования зависят от параметров языка. Следующая таблица содержит стили, для которых преобразование строковых значений в datetime не детерминировано.
Все стили меньше 1001106
107109
113130
|
1 За исключением стилей 20 и 21
SQL Server 2005 помечает преобразования строковых значений в datetime как недетерминированные.
DBCC CHECKFILEGROUP
Если некластеризованный индекс в указанной файловой группе связан с таблицей в другой файловой группе, проверяются индекс и базовая таблица в другой файловой группе.
Если некластеризованный индекс в указанной файловой группе связан с таблицей в другой файловой группе, индекс не проверяется, так как базовая таблица не доступна для проверки.
DBCC SHOW_STATISTICS
Набор строк, возвращенный DBCC SHOW_STATISTICS, не содержит столбец Name.
Первый набор строк, возвращенный DBCC SHOW_STATISTICS, содержит дополнительный столбец с заголовком Name. Этот столбец показывается первым в результирующем наборе. Если имеются приложения, которые обращаются к столбцам, возвращенным инструкцией DBCC SHOW_STATISTICS по порядковому номеру, измените их для обращения к столбцам по имени.
DROP LOGIN
При выполнении инструкции DROP LOGIN имя входа не удаляется, если оно сопоставлено с пользователями базы данных.
При выполнении инструкции DROP LOGIN имя входа удаляется, даже если оно сопоставлено с пользователями базы данных.
Выражения в вычисляемых столбцах, ограничения CHECK и DEFAULT
Исходный текст выражения, включая пробелы, сохраняется в метаданных каталога. Например, выражение вычисляемого столбца, введенное в виде c1 + c2 + 1
, будет выглядеть точно так, как если бы было введено в столбце типа text в системной таблице syscomments.
Исходный текст выражения подвергается дешифрованию и нормализации, а выходные данные этой операции сохраняются в метаданных каталога. Семантика дешифрованного выражения будет эквивалентна исходному тексту, однако синтаксическое соответствие не гарантируется. Например, выражение вычисляемого столбца, введенное в виде c1 + c2 + 1
, будет выглядеть как (([c1]+[c2])+(1))
в столбце определения в представлении системного каталога sys.computed_columns.
Выражения в запросах
Небезопасные выражения в запросах не всегда формируют исключение во время выполнения.
SQL Server 2005 иногда вычисляет выражения в запросах быстрее, чем они вычисляются в SQL Server 2000. Такая его работа дает следующие важные преимущества:
- Способность сопоставлять индексы вычисляемых столбцов с выражениями запроса, совпадающими с выражением вычисляемых столбцов.
- Предотвращение избыточных вычислений результатов выражений.
Однако, в зависимости от характера запроса и данных в базе данных, исключения во время выполнения могут возникать в SQL Server 2005, если запрос содержит существующее небезопасное выражение. Эти исключения во время выполнения содержат следующее:
- Арифметические исключения: деление на ноль, переполнение, потеря точности.
- Ошибки преобразований: потеря точности, попытка преобразовать нечисловую строку в число и др.
- Статистическая обработка набора значений, не все из которых гарантированно отличаются от NULL.
Эти исключения не возникают в отдельном приложении SQL Server 2000, которое использует определенные данные. Однако план-запрос, который изменяется из-за меняющейся статистики, потенциально может привести к исключению в SQL Server 2000. Эти исключения во время выполнения можно предотвратить изменением запроса, чтобы включить условные выражения, такие как NULLIF или CASE. Дополнительные сведения по обновлению компонентов SQL Server см. в разделе Устранение ошибок и предупреждений по выражениям запроса.
fn_servershareddrives
Данные, возвращенные системной функцией fn_servershareddrives, могут быть просмотрены членами роли public.
Изменение разрешения: fn_servershareddrives требует наличия у пользователя разрешения VIEW SERVER STATE для сервера.
Важно!
Эта системная функция SQL Server 2000 включена для обратной совместимости. Рекомендуется использовать вместо нее sys.dm_io_cluster_shared_drives.
fn_virtualfilestats
Данные, возвращенные системной функцией fn_virtualfilestats, могут быть просмотрены членами роли public.
Изменение разрешения: fn_virtualfilestats требует наличия у пользователя разрешения VIEW SERVER STATE для сервера.
fn_virtualservernodes
Данные, возвращенные системной функцией fn_virtualservernodes, могут быть просмотрены членами роли public.
Изменение разрешения: fn_virtualservernodes требует наличия у пользователя разрешения VIEW SERVER STATE для сервера.
Важно!
Эта системная функция SQL Server 2000 включена для обратной совместимости. Рекомендуется использовать вместо нее sys.dm_os_cluster_nodes.
HOST_ID
Инструкция HOST_ID возвращает значение char(8).
HOST_ID возвращает значение char(10).
Индексы
Разрешаются индексы, описанные в столбце "Поведение SQL Server 2005".
Следующие индексы могут быть отключены во время процесса обновления или могут требовать перестроения из-за изменений, введенных в SQL Server 2005:
- Индексы в вычисляемых столбцах, которые используют CHECKSUM(some_timestamp_column), будут отключены, потому что изменилось поведение для функции Transact-SQL CHECKSUM, когда она принимает столбец timestamp в качестве аргумента.
- Индексы, которые содержат символьные значения 0x3390, 0x33ca или 0x33cb в столбцах nvarchar или nchar, использующих параметры сортировки для турецкого языка, могут потребовать перестроения, потому что изменились принципы сортировки в этих параметрах сортировки.
- Индексы в вычисляемых столбцах или представлениях, в которых представление или выражение вычисляемого столбца содержит либо неявное преобразование из строкового значения в datetime или smalldatetime, либо явное недетерминированное преобразование из строкового значения в datetime или smalldatetime, будут отключены.
Для индексов, которые требуют перестроения из-за изменений, описанных в первых двух пунктах, приведенных ранее, используйте следующую процедуру.
Проверьте журнал ошибок SQL Server на наличие предупреждающих сообщений 3801, 3803 и 3804.
Запустите инструкцию DBCC CHECKTABLE в базовой таблице, чтобы выяснить наличие проблемы.
Если результаты выполнения инструкции DBCC показывают, что проблема существует, повторно постройте индекс, используя один из следующих методов:
- Инструкция ALTER INDEX с предложением REBUILD
- Инструкция CREATE INDEX с предложением DROP_EXISTING
- DBCC DBREINDEX
Определите отключенные ограничения FOREIGN KEY, используя следующую инструкцию:
SELECT * FROM sys.foreign_keys WHERE is_disabled=1;
Включите все ограничения FOREIGN KEY с помощью инструкции ALTER TABLE CHECK CONSTRAINT.
Ограничения PRIMARY KEY и UNIQUE включаются путем перестроения соответствующего индекса. Индекс должен быть перестроен до включения ограничений FOREIGN KEY, которые ссылаются на ограничение PRIMARY KEY или UNIQUE.
Для индексов, отключенных из-за изменений и описанных в третьем пункте, приведенном ранее, используйте следующую процедуру.
Определите индексы в вычисляемых столбцах, которые были отключены, используя следующую инструкцию:
SELECT object_name(i.object_id) AS object_name, i.* FROM sys.indexes AS i JOIN sys.index_columns AS ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id JOIN sys.computed_columns AS cc ON ic.object_id = cc.object_id AND ic.column_id = cc.column_id WHERE i.is_disabled = 1
Для индекса вычисляемого столбца удалите индекс, а затем измените определение вычисляемого столбца, чтобы использовать явную функцию CONVERT с детерминированным стилем данных.
Для индексированного представления удалите представление, а затем переопределите его, используя явную функцию CONVERT с детерминированным стилем данных.
Заново создайте индекс в измененном вычисляемом столбце или представлении.
Индексы
Параллельные индексные операции поддерживаются в выпусках SQL Server 2000 Developer Edition, SQL Server 2000 Standard Edition и SQL Server 2000 Enterprise Edition.
Параллельные индексные операции, которые создают, удаляют или перестраивают индексы, доступны только в выпусках SQL Server 2005 Developer и в SQL Server 2005 Enterprise Edition.
Пользователи, которые проводят обновление от выпуска SQL Server 2000 Standard Edition до выпуска SQL Server 2005 Standard Edition, должны учитывать, что операции, которые создают, удаляют или перестраивают индексы, выполняются последовательно в стандартном выпуске SQL Server 2005 и могут занимать больше времени.
Это не относится к инструкциям SELECT, INSERT, UPDATE, и DELETE. В выпуске SQL Server 2005 Standard Edition они будут выполняться параллельно.
После обновления до выпуска SQL Server 2005 Standard Edition отслеживайте операции создания, удаления или перестроения индексов. Может оказаться, что необходимо настроить сценарии обслуживания или плановые действия по обслуживанию, чтобы предоставить дополнительное время для этих операций.
Для выполнения параллельных индексных операций установите SQL Server 2005 Enterprise Edition.
предложение ORDER BY
Имена столбцов в предложении ORDER BY разрешаются в столбцы, перечисленные в списке выбора, независимо от наличия квалификаторов столбцов.
Например, следующий запрос выполняется без ошибки:
USE pubs
SELECT au_fname AS 'FName',
au_lname AS 'LName'
FROM authors a
ORDER BY a.LName
SQL Server игнорирует квалификатор a
в предложении ORDER BY
и разрешает имя столбца LName
в список выбора.
Имена и псевдонимы столбцов с квалификаторами разрешаются в столбцы таблиц, перечисленных в предложении FROM. Если в выражении order_by_expression отсутствует квалификатор, то оно должно быть уникальным во всех столбцах, перечисленных в инструкции SELECT.
Например, следующий эквивалентный запрос возвращает ошибку:
USE AdventureWorks
SELECT FirstName AS 'FName',
LastName AS 'LName'
FROM Person.Contact p
ORDER BY p.LName
SQL Server не игнорирует квалификатор p
в предложении ORDER BY
и разрешает имя столбца LName
в таблицы, перечисленные в предложении FROM
. Однако предложение FROM
не распознает, что имя столбца LName
является псевдонимом столбца таблицы p
.
Функция SERVERPROPERTY
Возвращаемым типом свойства ProductVersion в функции SERVERPROPERTY является varchar.
Возвращаемым типом свойства ProductVersion в функции SERVERPROPERTY является nvarchar.
sp_addtype
Любой пользователь может выполнять процедуру sp_addtype.
Пользователи должны быть членами роли базы данных db_ddladmin или db_owner для выполнения процедуры sp_addtype.
Чтобы разрешить пользователям создавать типы псевдонимов данных, следует произвести следующие изменения:
- Чтобы использовать процедуру sp_addtype, добавьте пользователей к роли базы данных db_ddladmin или db_owner.
- Чтобы создать тип псевдонима данных посредством использования CREATE TYPE, предоставьте пользователям разрешение CREATE TYPE, а также предоставьте разрешение ALTER пользователям целевой схемы.
sp_altermessage
Процедуру sp_altermessage можно использовать для определения необходимости записи системного сообщения (сообщения с идентификатором Message ID < 50000) в журнал приложений Windows.
Процедуру sp_altermessage нельзя использовать для изменения поведения регистрации системных сообщений (сообщений с идентификатором Message ID < 50000). Для аудита системных сообщений используйте трассировку SQL и класс события «User Error Message Event Class». Дополнительные сведения по обновлению компонентов SQL Server см. в разделе Знакомство с трассировкой SQL.
sp_changedbowner
Только члены фиксированной серверной роли sysadmin, фиксированной роли базы данных db_owner или члены обоих фиксированных ролей базы данных db_ddladmin и db_securityadmin могут выполнять процедуру sp_changeobjectowner.
Пользователю, который может выполнить эту хранимую процедуру как член фиксированных ролей базы данных db_ddladmin и db_securityadmin, также нужно предоставить разрешение CONTROL на защищаемый объект. Выполнение процедуры sp_changeobjectowner без разрешения CONTROL на целевой объект вызовет сбой выполнения и выведет следующее сообщение об ошибке:
Msg 15247, Level 16, State 1, Procedure sp_changeobjectowner, Line 17
У пользователя нет разрешения на выполнение этого действия».
sp_help
Процедура sp_help возвращает один результирующий набор для функций.
Процедура sp_help возвращает два результирующих набора для функций. Дополнительный результирующий набор предназначен для параметров функций.
sysindexes
Таблица sys.sysindexes включена для обратной совместимости. Однако изменения в SQL Server 2005 препятствуют полной обратной совместимости представления с предыдущими версиями SQL Server.
Системные метаданные
Члены роли public могут запрашивать системные таблицы и отображать метаданные из каталога.
Пользователи, запрашивающие каталог, могут видеть только строки метаданных тех объектов, владельцами которых они являются, или объектов, на которые они имеют некоторые разрешения, или объектов, для которых они имеют права доступа в рамках членства в роли. Дополнительные сведения и рекомендуемые корректирующие действия см. в разделах Настройка видимости метаданных и Устранение неполадок, связанных с видимостью метаданных.
Системные таблицы
Системные таблицы имеют тип 'S'.
Системные таблицы доступны как совместимые представления и имеют тип 'V'. Инструкции, которые запрашивают системные таблицы и включают критерий поиска type = 'S', завершатся ошибкой.
Измените критерий поиска инструкции на type = 'V'
или
выполните перенос данных в новые представления каталога или динамические административные представления. Дополнительные сведения по обновлению компонентов SQL Server см. в разделе Соответствия между системными таблицами SQL Server 2000 и системными представлениями SQL Server 2005.
Подсказка TABLOCK при массовом импорте через bcp, BULK INSERT или OPENROWSET(BULK...)
При массовом импорте в таблицу с непустым кластеризованным индексом подсказка TABLOCK игнорируется.
При массовом импорте в таблицу с непустым кластеризованным индексом подсказка TABLOCK запрашивает блокировку X для таблицы. Это предотвращает параллельное выполнение массового импорта. Если в этом случае необходимо параллельное выполнение массового импорта, не указывайте подсказку TABLOCK. Дополнительные сведения о параллельном выполнении массовой загрузки см. в разделе Рекомендации по оптимизации массового импорта данных.
Триггеры
Прямая рекурсия триггеров происходит только тогда, когда триггер срабатывает и выполняет действие, вызывающее повторное срабатывание того же триггера.
Прямая рекурсия триггеров возникает в одном из следующих случаев:
- Триггер срабатывает и выполняет действие, которое вызывает новое срабатывание того же триггера.
- Вызывается тот же триггер, но после того, как вызван триггер другого типа (AFTER или INSTEAD OF).
Косвенная рекурсия возникает, когда триггер срабатывает и выполняет действие, которое вызывает срабатывание другого триггера того же типа (AFTER или INSTEAD OF). Второй триггер выполняет действие, вызывающее повторное срабатывание исходного триггера.
Дополнительные сведения см. в разделе «Рекурсивные триггеры» подраздела Использование вложенных триггеров.
Триггеры
При выполнении инструкции UPDATE или DELETE для локального или распределенного секционированного представления, срабатывают все триггеры типа UPDATE или DELETE, определенные для базовых таблиц данного представления, В том числе триггеры таблиц, на которых операция обновления или удаления не отразится.
Если инструкция UPDATE или DELETE выполняется для секционированного представления, триггеры типа UPDATE и DELETE срабатывают только в том случае, если базовой таблицы, для которой определен триггер, коснулась данная операция обновления или удаления. Дополнительные сведения см. в разделе Выполнение триггера DML.
Функция UPDATE()
Функция UPDATE() не определяет изменения в столбцах timestamp. Для этих столбцов предложение IF UPDATE() внутри тела триггера возвращает значение FALSE независимо от того, обновились ли столбцы.
Функция UPDATE() определяет изменения в столбцах timestamp. Для этих столбцов предложение IF UPDATE() внутри тела триггера DML возвращает значение TRUE, если столбцы обновились.
Пользовательские функции
В пользовательских функциях не могут использоваться недетерминированные встроенные системные функции.
В пользовательские функции Transact-SQL может входить большинство недетерминированных встроенных системных функций. Полный список разрешенных встроенных функций см. в разделе Создание пользовательских функций (Database Engine).
Типы данных varchar, nvarchar и varbinary
Строка или двоичное значение нулевой длины, используемые в качестве определения вычисляемого столбца таблицы, создают столбец типа varchar(0), nvarchar(0) или varbinary(0).
Строка или двоичное значение нулевой длины, используемые в качестве определения вычисляемого столбца таблицы, создают столбец типа varchar(1), nvarchar(1) или varbinary(1). Это изменение относится только к типам данных вычисляемых столбцов, но не к вычисляемому значению.
Внесите изменения в приложения, которые проверяют длину вычисляемого столбца и полагаются на минимальную длину столбца в 1 байт для столбцов типа varchar и varbinary, и в 2 байта для столбцов типа nvarchar.
Доступ к виртуальным таблицам
К виртуальным таблицам могут получать доступ гости и члены роли public.
Для доступа к виртуальной таблице, такой как sysprocesses, требуются разрешения VIEW SERVER STATE и SELECT.
Предложение WITH CHECK OPTION для представлений
Операции INSERT и UPDATE допускаются для представлений, для которых указано предложение WITH CHECK OPTION и которые создаются с помощью удаленной таблицы, даже когда эти операции выполняются вне рамок инструкции SELECT представления.
SQL Server 2005 подтверждает предложение WITH CHECK OPTION, когда операции INSERT и UPDATE выполняются на представлениях, созданных с помощью таблицы из удаленных источников данных.
Если операции INSERT и UPDATE дадут сбой на представлениях, созданных с помощью удаленной таблицы, из-за предложения WITH CHECK OPTION и такое поведение необходимо будет исправить, измените представление, не указывая предложение WITH CHECK OPTION.
Дополнительные сведения см. в разделах CREATE VIEW (Transact-SQL), ALTER VIEW (Transact-SQL) и Изменение данных через представление.
xp_cmdshell
Когда происходит ошибка в ходе выполнения xp_cmdshell, выводится сообщение об ошибке, но выполнение не прекращается.
Когда происходит ошибка в ходе выполнения xp_cmdshell, выводится сообщение об ошибке и выполнение прекращается.
См. также
Справочник
Критические изменения в функциях компонента SQL Server 2005 Database Engine
Устаревшие функции ядра СУБД в SQL Server 2005
Неподдерживаемые функции ядра СУБД в SQL Server 2005
Другие ресурсы
Обратная совместимость компонента SQL Server 2005 Database Engine
sp_dbcmptlevel (Transact-SQL)
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
17 июля 2006 г. |
|
5 декабря 2005 г. |
|