
- •Типы данных mssqlServer2005. Названия, характеристики, области применения.
- •2. Операции в mssqlServer2005. Названия и назначение. Типы данных, для которых операции применимы. Примеры.
- •3. Приведение типов данных. Явное и неявное приведение типов данных. Функции casTи convert. Совместимость типов данных. Функции coalesce, case, isnull. Примеры.
- •4. Команда создания таблицы. Синтаксис, подробное описание секций команды. Примеры.
- •5. Команда изменения структуры таблицы. Синтаксис, подробное описание секций команды. Примеры.
- •6. Команда удаления таблицы и команды удаления данных из таблицы. Синтаксис, подробное описание секций команд. Примеры.
- •Дополнительные сведения
- •7. Commontableexpressions (cte). Их назначение и синтаксис описания. Ограничения при описании cte. Рекурсивные cteи ограничения при их описании. Примеры.
- •8. Команда извлечения данных из таблицы. Секция From, синтаксис, подробное описание. Использование горизонтальных и вертикальных объединений.Примеры.
- •Into имя_таблицы
- •9. Команда извлечения данных из таблицы. Синтаксис, подробное описание секций команды (кроме секции from). Примеры.
- •Into имя_таблицы
- •10. Команда добавления (вставки) данных в таблицу. Синтаксис, подробное описание секций команды. Примеры.
- •11. Команда изменения данных в таблице. Синтаксис, подробное описание секций команды. Примеры.
- •Дополнительные сведения
- •12. Курсоры. Необходимость их применения. Синтаксис описания (подробно). Общая схема работы с курсором. Команды и функции для работы с курсором. Примеры.
- •16. Триггеры. Необходимость их применения. Синтаксис команды создания / изменения logoNтриггеров (подробно). Синтаксис команды удаления триггера (подробно). Пример триггера.
- •20. Типы данных mssqlServer2008 (отличия от типов данных mssqlServer2005). Названия, характеристики, области применения.
- •21. Команды создания / изменения структуры таблиц (отличия в синтаксисе в mssqlServer2008 по сравнению с mssqlServer2005).
- •Типы данных mssqlServer2005. Названия, характеристики, области применения.
10. Команда добавления (вставки) данных в таблицу. Синтаксис, подробное описание секций команды. Примеры.
Запрос на добавление нескольких записей:
INSERT INTO назначение [(поле_1[, поле_2[, ...]])] [IN внешняяБазаДанных] SELECT [источник.]поле_1[, поле_2[, ...] FROM выражение
Запрос на добавление одной записи:
INSERT INTO назначение [(поле_1[, поле_2[, ...]])] VALUES (значение_1[, значение_2[, ...])
Инструкцию INSERT INTO можно использовать для добавления одной записи в таблицу с помощью запроса на добавление одной записи, описанного выше. В этом случае инструкция содержит имя и значение каждого поля записи. Нужно определить все поля записи, в которые будет помещено значение, и значения для этих полей. Если поля не определены, в недостающие столбцы будет вставлено значение по умолчанию или значение Null. Записи добавляются в конец таблицы.
Инструкцию INSERT INTO можно также использовать для добавления набора записей из другой таблицы или запроса с помощью предложения SELECT ... FROM, как показано выше в запросе на добавление нескольких записей. В этом случае предложение SELECT определяет поля, добавляемые в указанную таблицу назначение.
Пример
IF NOT EXISTS(SELECT * FROM Адрес WHERE [id_адреса]=0)
INSERT INTO Адрес VALUES (0, 0, 0, '15a', 8, 1)
11. Команда изменения данных в таблице. Синтаксис, подробное описание секций команды. Примеры.
UPDATE таблица SET новоеЗначение WHERE условиеОтбора;
Ниже перечислены аргументы инструкции UPDATE:
Элемент |
Описание |
таблица |
Имя таблицы, данные в которой следует изменить. |
новоеЗначение |
Выражение, определяющее значение, которое должно быть вставлено в указанное поле обновленных записей. |
условиеОтбора |
Выражение, отбирающее записи, которые должны быть изменены. При выполнении этой инструкции будут изменены только записи, удовлетворяющие указанному условию. |
Дополнительные сведения
Инструкцию UPDATE особенно удобно использовать для изменения сразу многих записей или в том случае, если записи, подлежащие изменению, находятся в разных таблицах.
Одновременно можно изменить значения нескольких полей. Следующая инструкция SQL увеличивает стоимость заказа на 10 процентов, а стоимость доставки на 3 процента:
UPDATE Заказы
SET СуммаЗаказа = СуммаЗаказа * 1.1,
СтоимостьДоставки = СтоимостьДоставки * 1.03
WHERE СтранаПолучателя = 'Литва';
Инструкция UPDATE не приводит к созданию результирующего набора записей. Кроме того, нельзя восстановить записи, обновленные с помощью запроса на обновление. Чтобы узнать, какие записи будут изменены, сначала просмотрите результаты запроса на выборку, использующего те же самые условия отбора, а затем выполните запрос на обновление записей.
12. Курсоры. Необходимость их применения. Синтаксис описания (подробно). Общая схема работы с курсором. Команды и функции для работы с курсором. Примеры.
-
Объявление курсора с помощью DECLARE или DECLARE и SET.
-
Открытие курсора (OPEN).
-
Извлечение данных из курсора (FETCH).
-
Закрытие курсора (CLOSE).
-
Удаление ссылки на курсор. (DEALLOCATE). Может применяться без CLOSE.
DECLARE cursor_name CURSOR
[LOCAL | GLOBAL] область видимости - область действия
[FORWARD_ONLY | SCROLL] порядок извлечения данных
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD] свойства связи с таблицей
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] обновление данных
[TYPE_WARNING] неявное преобразование типа курсора
FOR <команда SELECT> выборка
[FOR UPDATE [OF список_имен_столбцов]] список столбцов, которые могут обновлятся
OPEN служит для открытия курсора, а также для наполнения его данными (выполнения соответствующего запроса SELECT). OPEN {[GLOBAL] <имя курсора> | @cursor_variable}
FETCH служит для извлечения строки из курсора и имеет следующий синтаксис:
FETCH[ [NEXT | PRIOR | FIRST | LAST | определяет извлекаемую из курсора строку
ABSOLUTE {номер строки | @var} |
RELATIVE {номер строки | @var} ] FROM]
{[GLOBAL] <имя курсора> | @cursor_variable}
[INTO @var1, @var2, …] позволяющая выводить значения элементов извлекаемой строки не на экран, а в переменные
CLOSE Закрывает указанный открытый курсор, освобождая все блокировки данных сделанные курсором и выбранное курсором множествострок.CLOSE {[GLOBAL] <имя курсора> | @cursor_variable}
DEALLOCATE Удаляет ссылки на указанный курсор. Когда последняя ссылка на курсор удаляется, то это приводит к удалению всех структур данных, используемых курсором. Может применяться без команды CLOSE. DEALLOCATE {[GLOBAL] <имя курсора> | @cursor_variable}
-
@@CURSOR_ROWS – возвращает количество строк, содержащихся в последнем открытом в текущем соединении курсоре. Может вернуть такие значения:
-
некоторое отрицательное число. Показывает, что этот курсор наполняется данными асинхронно. Может иметь место для больших KEYSET или STATIC курсоров.
-
-1. Возвращается для динамического курсора (DYNAMIC). Т.к. этот курсор отображает все изменения в исходных данных, то количество содержащихся в нем строк неизвестно.
-
0. Курсор еще не открыт, уже закрыт или ни одна строка для него не выбрана.
-
Некоторое положительное число. Количество строк, извлеченных в курсор.
CURSOR_STATUS({{‘local’ | ‘global’}, ‘имя курсора’ | ‘variable’, ‘@cursor_var’}) – возвращает состояние курсора. Имеет 2 строковых аргумента: 1-ый имеет значение ‘local’ или ‘global’ для курсоров, заданных именем (2-ой параметр) или ‘variable’ – для курсоров заданных переменной (2-ой параметр). Может возвращать следующие значения:
-
1. Показывает, что этот курсор открыт и имеет хотя бы 1 строку (для DYNAMIC курсоров 0 или более строк).
-
0. Курсор открыт, но не содержит строк. Это значение не может быть возвращено для DYNAMIC курсоров.
-
-1. Курсор закрыт.
-
-2. Может быть возвращено, если курсор задан переменной. Означает, что курсор не связан с переменной.
-
-3. Такого курсора или переменной не существует или переменная существует, но не связана с курсором.
@@FETCH_STATUS – возвращает результат выполнения последней команды FETCH (целое число):
-
0. Команда FETCH выполнена успешно.
-
-1. Команда FETCH не могла быть выполнена успешно или заданная строка выходит за границы имеющегося множества строк.
-2. Извлекаемая строка отсутствует.
13. Триггеры. Необходимость их применения. Синтаксис команды создания / изменения DMLтриггеров (подробно). Синтаксис команды удаления триггера (подробно). Особенности написания триггеров, реагирующих на несколько событий (функции COLUMNSUPDATEDи UPDATE). Использование таблиц inserted и deleted. Порядок срабатывания триггеров.
Триггер – это хранимая процедура, которая начинает свою работу в случае выполнения действия, на которое триггер настроен. Триггеры применяются для решения задач поддержания целостности (корректности) данных, когда по каким-либо причинам невозможно (неудобно) использовать ограничения FOREIGN KEY (или ограничений на значения столбцов), и безопасности, когда, например, недопустимы какие-либо изменения в данных. Триггеры бывают нескольких типов: DML, DDL и LOGON. DML триггеры могут срабатывать при выполнении (после выполнения или вместо выполнения) команд INSERT, UPDATE и DELETE для таблиц или представлений. Этот тип триггеров присутствовал и в MS SQL Server 2000. DDL триггеры могут срабатывать при выполнении после выполнения команд CREATE, ALTER, DROP, GRANT, DENY, REVOKE, UPDATE STATISTICS и некоторых системных процедур. LOGON триггеры срабатывают после установки соединения с MS SQL Server. DDL и LOGON триггеры можно использовать только в MS SQL Server 2005
CREATE TRIGGER [пространство_имен.]название_триггера
ON {название_таблицы | название_представления}
[WITH
{ ENCRYPTION |
EXEC[UTE] AS {CALLER | SELF | OWNER | ‘имя_пользователя’} }[,]]
{ FOR [AFTER] | INSTEAD OF}
{[INSERT] [,] [UPDATE] [,] [DELETE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
{ Перечень_команд_SQL |
EXTERNAL NAME имя_сборки.имя_класса.название_метода [;]}
При написании тела DML триггеров можно использовать специальные функции COLUMNS_UPDATED() и UPDATE(имя_столбца), а также две специальные таблицы inserted и deleted. Их применение позволяет определить, какое действие вызвало активацию триггера, если триггер может быть активирован различными командами. В случае же использования INSTEAD OF триггера данные в таблице или представлении не изменяются, так как триггер вызван вместо активировавшего его действия. Использование же таблиц inserted и deleted позволяет определить, как данные должны были бы измениться.
Функция COLUMNS_UPDATED() возвращает значение типа varbinary, представляющее собой набор байт, каждый из которых представляет информацию об изменении значения группы из 8-ми столбцов. При этом 1-ый байт представляет эту информацию для 1-ой группы из 8-ми столбцов и т.д. В каждом байте младший бит (нулевой) представляет информацию об изменении 1-ого столбца группы, 1-ый бит – 2-ого столбца и т.д. Если какой-либо столбец изменился, то соответствующий ему бит будет равен 1, иначе 0. Функция COLUMNS_UPDATED() выдает одни и те же значения независимо от того, изменилось ли в результате выполнения команды UPDATE хотя бы одно значение в обновляемых столбцах или нет. При активации триггера командой INSERT функция COLUMNS_UPDATED() возвращает значение, соответствующее изменению ВСЕХ столбцов таблицы или представления.
Функция UPDATE(имя_столбца) ведет себя аналогично функции COLUMNS_UPDATED(), однако имеет следующие отличия: применима только к одному столбцу и возвращает значение TRUE, если столбец изменился, и FALSE – в противном случае. Эту функцию можно последовательно применять в уловном операторе IF для проверки изменения нескольких столбцов.
Таблицы inserted и deleted являются временными хранящимися в памяти таблицами, создаваемыми при запуске DML триггера автоматически. Их структуру и данные в них нельзя изменять, создавать индексы для этих таблиц также недопустимо, их использование возможно ТОЛЬКО в теле DML триггеров. Таблица deleted содержит строки, которые были удалены или строки, которые были обновлены командой UPDATE, причем в последнем случае для обновляемых столбцов содержатся их первоначальные значения. Таблица inserted содержит добавляемые в таблицу строки (команда INSERT) или обновляемые строки, причем в последнем случае в обновляемых столбцах этой таблицы содержатся новые значения. Следует отметить, что для INSTEAD OF триггеров получить измененные/добавленные значения можно получить ТОЛЬКО из таблицы inserted, а набор удаляемых строк – ТОЛЬКО из таблицы deleted. Если в результате выполнения какой-либо из команд, которая должна была привести к срабатыванию триггера, ни одна строка (значение в строке) в таблице (представлении) не была изменена, то триггер все равно будет вызван. При этом количество строк в таблицах inserted и deleted будет равно 0.
@order – определяет последовательность срабатывания триггера, имеет тип данных varchar(10) и может принимать значения: ‘First’ – триггер срабатывает первым, ‘Last’ – триггер срабатывает последним, ‘None’ – порядок срабатывания триггера не определен. Следует отметить, что первый и последний триггеры должны ОБЯЗАТЕЛЬНО отличаться и можно описать только один первый и один последний триггеры для какого-либо действия.
@stmttype – описывает тип действия, для которого устанавливает порядок выполнения триггеров, имеет тип данных varchar(50) и может иметь следующие значения: ‘INSERT’, ‘UPDATE’, ‘DELETE’, ‘LOGON’ или название любого из типов событий, допустимых при создании DDL триггера.
@namespace – задает уровень DDL триггера: DATABASE или SERVER. Для LOGON триггеров можно указать только SERVER, для DML триггеров – либо не указывать последний параметр, либо указать значение NULL.
Следует отметить, что при изменении триггера, имеющего атрибут First или Last командой ALTER TRIGGER, этот атрибут автоматически сбрасывается и требует своей повторной установки с помощью процедуры sp_settriggerorder.
14. Триггеры. Необходимость их применения. Примеры DMLтриггеров реагирующих на одно и несколько событий. Способы определения события, активировавшего триггер. Ограничения на команды, содержащиеся в теле DMLтриггера.
Триггер – это хранимая процедура, которая начинает свою работу в случае выполнения действия, на которое триггер настроен. Триггеры применяются для решения задач поддержания целостности (корректности) данных, когда по каким-либо причинам невозможно (неудобно) использовать ограничения FOREIGN KEY (или ограничений на значения столбцов), и безопасности, когда, например, недопустимы какие-либо изменения в данных. Триггеры бывают нескольких типов: DML, DDL и LOGON. DML триггеры могут срабатывать при выполнении (после выполнения или вместо выполнения) команд INSERT, UPDATE и DELETE для таблиц или представлений. Этот тип триггеров присутствовал и в MS SQL Server 2000. DDL триггеры могут срабатывать при выполнении после выполнения команд CREATE, ALTER, DROP, GRANT, DENY, REVOKE, UPDATE STATISTICS и некоторых системных процедур. LOGON триггеры срабатывают после установки соединения с MS SQL Server. DDL и LOGON триггеры можно использовать только в MS SQL Server 2005
Создание простейшего AFTER триггера, который срабатывает при выполнении команды DELETE и в случае удаления одной из строк таблицы, содержащих в столбце c1 значение 1, удаляет все такие строки в таблице. Кроме этого возникает проблема, связанная с проверкой того, существует ли такой триггер в данном пространстве имен.
Перед созданием триггера необходимо убедиться, что такого триггера в используемом пространстве имен. Для этого необходимо сделать соответствующий запрос к системной таблице sysobjects, в котором необходимо выбрать строку, содержащую информацию об объекте с именем trig1, тип которого TR (триггер). Кроме этого поле uid (номер схемы) должно соответствовать номеру нужного пространства имен. Этот номер можно получить путем выборки из системного представления sys.schemas поля schema_id у строки, которая содержит в поле name соответствующее название пространства имен.
if exists(select * from sysobjects where name = 'trig1' and
uid = (select schema_id from sys.schemas where name = 'dbo') and type = 'TR')
drop trigger trig1 go
При написании тела DML триггеров можно использовать специальные функции COLUMNS_UPDATED() и UPDATE(имя_столбца), а также две специальные таблицы inserted и deleted. Их применение позволяет определить, какое действие вызвало активацию триггера, если триггер может быть активирован различными командами. В случае же использования INSTEAD OF триггера данные в таблице или представлении не изменяются, так как триггер вызван вместо активировавшего его действия. Использование же таблиц inserted и deleted позволяет определить, как данные должны были бы измениться.
Правила, по которым можно определить какое действие активировало триггер, если триггер может быть активирован несколькими командами:
-
Если функция COLUMNS_UPDATED() вернула значение 0, то триггер был активирован командой удаления(DELETE), соответственно количество строк в таблице deleted будет соответствовать количеству удаляемых строк.
-
Если функция COLUMNS_UPDATED() вернула значение не 0, то триггер был активирован либо командой INSERT, либо командой UPDATE.
-
Если в таблице inserted ненулевое количество строк, а таблица deleted – не содержит строк, то триггер был активирован командой INSERT.
-
Если таблицы inserted и deleted содержат одинаковое ненулевое количество строк или таблицы inserted и deleted содержат нулевое количество строк и функция COLUMNS_UPDATED() вернула некоторое значение
, удовлетворяющее неравенству
, где
- количество столбцов в таблице или в представлении, то триггер был активирован командой UPDATE.
-
Если таблицы inserted и deleted содержат нулевое количество строк и функция COLUMNS_UPDATED() вернула некоторое значение
, такое что
, то определить какая из команд INSERT или UPDATE активировала триггер не представляется возможным, т.к. команда UPDATE может изменять значения во всех столбцах, а команда INSERT может не вставить ни одной строки.
-
15. Триггеры. Необходимость их применения. Синтаксис команды созданий / изменения DDLтриггеров (подробно). Синтаксис команды удаления триггера (подробно). Особенности написания триггеров, реагирующих на несколько событий (функция EVENTDATA). Примеры триггеров.
Триггер – это хранимая процедура, которая начинает свою работу в случае выполнения действия, на которое триггер настроен. Триггеры применяются для решения задач поддержания целостности (корректности) данных, когда по каким-либо причинам невозможно (неудобно) использовать ограничения FOREIGN KEY (или ограничений на значения столбцов), и безопасности, когда, например, недопустимы какие-либо изменения в данных. Триггеры бывают нескольких типов: DML, DDL и LOGON. DML триггеры могут срабатывать при выполнении (после выполнения или вместо выполнения) команд INSERT, UPDATE и DELETE для таблиц или представлений. Этот тип триггеров присутствовал и в MS SQL Server 2000. DDL триггеры могут срабатывать при выполнении после выполнения команд CREATE, ALTER, DROP, GRANT, DENY, REVOKE, UPDATE STATISTICS и некоторых системных процедур. LOGON триггеры срабатывают после установки соединения с MS SQL Server. DDL и LOGON триггеры можно использовать только в MS SQL Server 2005
DML триггер:
DROP TRIGGER пространство_имен.имя_триггера1[, пространство_имен.имя_триггера2…] [;]
DDL триггер:
DROP TRIGGER имя_триггера1[, имя_триггера2…]
ON {DATABASE | ALL SERVER}
[;]
LOGON триггер:
DROP TRIGGER имя_триггера1[, имя_триггера2…]
ON ALL SERVER
причем ключевое слово DATABASE показывает, что DDL триггер(ы) имеют уровень БД, а ключевое слово ALL SERVER показывает, что DDL триггер(ы) имеют уровень сервера.
Следует отметить, что:
-
Уничтожение таблицы уничтожает и все связанные с ней DML триггеры.
-
Когда триггер уничтожается, то информацию о нем из представлений sys.objects, sys.triggers, sys.sql_modules также удаляется.
-
Несколько DDL триггеров можно удалить одной командой DROP TRIGGER в том случае если все они имеют или уровень БД, или уровень сервера.
Для того чтобы переименовать триггер, необходимо выполнить соответствующие команды DROP TRIGGER и CREATE TRIGGER