Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL.doc
Скачиваний:
5
Добавлен:
07.12.2018
Размер:
284.16 Кб
Скачать

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. Курсоры. Необходимость их применения. Синтаксис описания (подробно). Общая схема работы с курсором. Команды и функции для работы с курсором. Примеры.

  1. Объявление курсора с помощью DECLARE или DECLARE и SET.

  2. Открытие курсора (OPEN).

  3. Извлечение данных из курсора (FETCH).

  4. Закрытие курсора (CLOSE).

  5. Удаление ссылки на курсор. (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}

  1. @@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 позволяет определить, как данные должны были бы измениться.

    Правила, по которым можно определить какое действие активировало триггер, если триггер может быть активирован несколькими командами:

    1. Если функция COLUMNS_UPDATED() вернула значение 0, то триггер был активирован командой удаления(DELETE), соответственно количество строк в таблице deleted будет соответствовать количеству удаляемых строк.

    2. Если функция COLUMNS_UPDATED() вернула значение не 0, то триггер был активирован либо командой INSERT, либо командой UPDATE.

      1. Если в таблице inserted  ненулевое количество строк, а таблица deleted – не содержит строк, то триггер был активирован командой INSERT.

      2. Если таблицы inserted и deleted содержат одинаковое ненулевое количество строк или таблицы inserted и deleted содержат нулевое количество строк и функция COLUMNS_UPDATED() вернула некоторое значение , удовлетворяющее неравенству , где - количество столбцов в таблице или в представлении, то триггер был активирован командой UPDATE.

      3. Если таблицы 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 триггер(ы) имеют уровень сервера.

    Следует отметить, что:

    1. Уничтожение таблицы уничтожает и все связанные с ней DML триггеры.

    2. Когда триггер уничтожается, то информацию о нем из представлений sys.objects, sys.triggers, sys.sql_modules также удаляется.

    3. Несколько DDL триггеров можно удалить одной командой DROP TRIGGER в том случае если все они имеют или уровень БД, или уровень сервера.

    Для того чтобы переименовать триггер, необходимо выполнить соответствующие команды DROP TRIGGER и CREATE TRIGGER

  • Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]