Перейти к содержимому

Как удалить триггер sql

  • автор:

УДАЛИТЬ ТРИГГЕР

После того как вы создали триггер в Oracle, вам может понадобиться удалить его из базы данных. Вы можете сделать это с помощью команды DROP TRIGGER.

Синтаксис

DROP TRIGGER имя_триггера;

Параметры и аргументы

имя_триггера наименование триггера, который вы хотите удалить.

Примечание

  • Смотрите также: как создать триггеры AFTER DELETE, AFTER INSERT, AFTER UPDATE, BEFORE DELETE, BEFORE INSERT, и BEFORE UPDATE.

Пример

DROP TRIGGER orders_before_insert;

Этот пример показывает как удалить триггер orders_before_insert с помощью команды DROP TRIGGER.

Как удалить триггер sql

В момент удаления записи (команда DELETE) срабатывает триггер удаления. Так же он сработает и при удалении записи клиентом на основе ADO или других технологий доступа к БД. Можно создавать триггер и только на удаление.

CREATE TRIGGER DELETE_CAR ON dbo.allcar FOR DELETE AS

Он будет отображаться специальным значком.

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

CREATE TRIGGER DELETE_CAR ON dbo.allcar FOR DELETE AS SELECT * FROM deleted

Давайте запретим удалять автомобили с типом 2, то есть легковые.

CREATE TRIGGER DELETE_CAR ON dbo.allcar FOR DELETE AS IF (SELECT COUNT(*) FROM deleted WHERE deleted.type=2)>0 BEGIN ROLLBACK TRANSACTION END

Мы здесь написали, если количество удаляемых записей в таблицу deleted с типом 2 больше чем 0 (то есть они есть, то надо запретить удаление). Вот тут нас ждут интересные веши. Например, если клиент ACCESS, то он удаляет запись и больше ее не показывает в таблице.

Но стоит сделать любую операцию, которая обновляет записи, например, сортировку, как она тут же появляется снова.

То есть ни какой реакции на отмену транзакции в триггере. В данном случае мы использовали триггер, как средство для реализации бизнес логики. Подходы здесь могут быть изощренные. Например, что какие-то данные должны храниться не менее трех лет с момента занесения или признаки, по которым нельзя удалять клиента из базы данных.

DeepEdit!

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

где имя_триггера — имя удаляемого триггера. При этом триггер удаляется из словаря данных. В операторе создания триггера можно указывать ключевые слова OR REPLACE, как это делается для подпрограмм. В этом случае если триггер существует, то сначала он удаляется.

Однако в отличие от процедур и функций можно, не удаляя триггер, запретить (DISABLE) его использование. Запрещенный триггер находит­ся в словаре данных, но никогда не активизируется. Для запрещения триггера применяется оператор ALTER TRIGGER:

ALTER TRIGGER им.я_ триггера ;

При создании триггера его использование разрешено (ENABLE) по умолчанию. С помощью оператора ALTER TRIGGER можно запретить, а затем повторно разрешить любой триггер. Ниже приведен пример запре­щения и повторного разрешения триггера UodateMaiorStats:

Кроме того, при помощи команды ALTER TABLE можно разрешить или запретить использование всех триггеров определенной таблицы, если

добавить конструкцию ENABLE ALL TRIGGERS (разрешить все триггеры)
или DISABLE ALL TRIGGERS (запретить все триггеры). Например:

В столбце status представления user_triggers находится либо ‘ENABLED’, либо ‘DISABLED’, и это значение показывает, каково текущее состояние триггера. Запрещение триггера не удаляет его из словаря дан­ных, как это происходит при выполнении команды DROP.

Р-код триггера

Если модуль или подпрограмма хранится в словаре данных, в дополнение к исходному программному тексту объекта хранится еще и его скомпили­рованный р- код. Это справедливо и для триггеров, т.е. их можно вызы­вать без перекомпиляции. Вместе с триггерами хранится информация об установленных для них зависимостях, в результате чего триггеры могут автоматически становиться недостоверными точно так же, как модули и подпрограммы. Если триггер становится недостоверным, он перекомпи­лируется при следующей его активизации.

  • Статьи
  • Собеседованиие?
  • Книги Oracle
  • Документация Oracle
  • Теория БД
  • SQL
  • Администрирование
  • Spatial
  • Производительность
  • Задачи по SQL
  • Том Кайт
  • Том Кайт. Архитектура, методики программирования и основные особенности версий 9i и 10g. Глава 8
  • Кэри Миллсап и Джефф Хольт Оптимизация производительности
  • PL/SQL-1
  • PL/SQL-2
  • PL/SQL-3
  • PL/SQL-4
  • Организация работы в сети
  • Delphi
  • Oracle PL/SQL для администраторов баз данных
  • Уроки Oracle
  • Oracle Data Integrator

Популярные

  • Работаем с Oracle
  • Администрирование Oracle 9i
  • 101 Oracle PL/SQL Как писать мощные и гибкие программы на PL/SQL
  • Удаление дубликатов строк
  • Oracle. Оптимизация производительности
  • Агрегатные функции. Группировка записей
  • Работа с событиями SQL*Net, заметно влияющими на время отклика
  • Oracle 9i Программирование на языке PL/SQL. Разработка эффективных приложений с помощью PL/SQL
  • Объединение таблиц
  • Oracle 9iR2 Разработка и эксплуатация хранилищ баз данных
  • Сервер Oracle 9i. Выпуск 9.2. Основные концепции
  • 101 Oracle настройка производительности. Все об управлении производительностью Oracle

DROP TRIGGER (Transact-SQL)

Удаляет один или более триггеров DML или DDL из текущей базы данных.

Синтаксис

-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) DROP TRIGGER [ IF EXISTS ] [schema_name.]trigger_name [ . n ] [ ; ] -- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE statement (DDL Trigger) DROP TRIGGER [ IF EXISTS ] trigger_name [ . n ] ON < DATABASE | ALL SERVER >[ ; ] -- Trigger on a LOGON event (Logon Trigger) DROP TRIGGER [ IF EXISTS ] trigger_name [ . n ] ON ALL SERVER 

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

IF EXISTS
Применимо к: SQL Server (с SQL Server 2016 (13.x); до текущей версии, База данных SQL).

Условное удаление триггера только в том случае, если он уже существует.

schema_name
Имя схемы, которой принадлежит триггер DML. Действие триггеров DML ограничивается областью схемы таблицы или представления, для которых они созданы. Аргумент schema_name не может указываться для триггеров DDL или триггеров входа.

trigger_name
Имя удаляемого триггера. Чтобы просмотреть список только что созданных триггеров, см. sys.server_assembly_modules или sys.server_triggers.

DATABASE
Обозначает область действия триггера DDL в текущей базе данных. Если при создании или изменении триггера был указан аргумент DATABASE, то он должен указываться и далее.

ALL SERVER
Применимо к: SQL Server 2008 (10.0.x) и более поздних версий.

Обозначает область действия триггера DDL на текущем сервере. Если при создании или изменении триггера был указан аргумент ALL SERVER, то он должен указываться и далее. Параметр ALL SERVER также применяется к триггерам входа.

Этот параметр недоступен в автономной базе данных.

Remarks

Триггер DML может быть удален напрямую или в результате удаления таблицы триггера. При удалении таблицы удаляются все связанные с ней триггеры.

При удалении триггера соответствующие данные в представлениях каталогов sys.objects, sys.triggers и sys.sql_modules также удаляются.

С помощью инструкции DROP TRIGGER сразу несколько триггеров DDL можно удалить только в том случае, если при их создании были использованы одинаковые предложения ON.

Чтобы переименовать триггер, используйте инструкции DROP TRIGGER и CREATE TRIGGER. Чтобы изменить определение триггера, используйте инструкцию ALTER TRIGGER.

Дополнительные сведения о просмотре текста триггеров см. в статьях sp_helptext (Transact-SQL) и sys.sql_modules (Transact-SQL).

Дополнительные сведения о просмотре списка существующих триггеров см. в статьях sys.triggers (Transact-SQL) и sys.server_triggers (Transact-SQL).

Разрешения

Чтобы удалить триггер DML, необходимо разрешение ALTER для таблицы или представления, в которых определен данный триггер.

Чтобы удалить триггер входа или триггер DDL, определенный в области сервера (ON ALL SERVER), для этого сервера требуется разрешение CONTROL SERVER. Чтобы удалить триггер DDL, определенный в области базы данных (ON DATABASE), необходимо разрешение ALTER ANY DATABASE DDL TRIGGER для текущей базы данных.

Примеры

A. Удаление триггера DML

В следующем примере триггер удаляется employee_insupd в базе данных AdventureWorks2022. (Начиная с версии SQL Server 2016 (13.x) можно использовать синтаксис DROP TRIGGER IF EXISTS.)

IF OBJECT_ID ('employee_insupd', 'TR') IS NOT NULL DROP TRIGGER employee_insupd; 

Б. Удаление триггера DDL

В ходе выполнения следующего примера происходит удаление триггера DDL safety .

Функция OBJECT_ID не может быть использована для выяснения факта существования в базе данных триггеров DDL, так как они не относятся к области схемы и данные о них не заносятся в каталог sys.objects. Запросы на объекты, не относящиеся к области схемы, должны выполняться при помощи соответствующих представлений каталогов. Для триггеров DDL используйте sys.triggers.

DROP TRIGGER safety ON DATABASE; 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *