T-SQL DROP TRIGGER
Master T-SQL DROP TRIGGER — permanently remove triggers from the database. Covers all three syntax forms (DML, ON DATABASE, ON ALL SERVER), the IF EXISTS option, multi-drop, comparison with DISABLE TRIGGER, dropping via SSMS, and verification.
DROP TRIGGER permanently removes a trigger from the database. The trigger's definition is gone — it stops firing, its source disappears from system catalogs, and the only way to bring it back is to CREATE TRIGGER it again.
DISABLE TRIGGER — the trigger stays in the database, just doesn't fire.Syntax depends on the trigger's scope. There are three forms:
1. DML triggers (on a table or view)
2. DDL triggers with database scope
3. DDL triggers with server scope (and logon triggers)
IF EXISTS (SQL Server 2016+). Without it, dropping a trigger that's already gone raises an error and stops your script. With it, the missing trigger is simply ignored.CREATE TABLE Address (
AddressID INT PRIMARY KEY,
Street NVARCHAR(100)
);
CREATE OR ALTER TRIGGER trgAddressAudit
ON Address
AFTER UPDATE
AS
PRINT 'Address row updated';
GO
DROP TRIGGER IF EXISTS trgAddressAudit;
GO
ON Address for DML triggers — SQL Server figures it out from the trigger name (because DML trigger names are unique within a schema). Some older syntax docs show ON table_name, but it's not actually used for DML drops.CREATE OR ALTER TRIGGER LogTableChanges
ON DATABASE
FOR CREATE_TABLE, DROP_TABLE
AS
PRINT 'Schema change detected';
GO
-- Remove it
DROP TRIGGER IF EXISTS LogTableChanges
ON DATABASE;
GO
USE master;
GO
DROP TRIGGER IF EXISTS AuditDatabaseCreation
ON ALL SERVER;
GO
List the names comma-separated. They must all be the same scope (all DML, all database-scope DDL, or all server-scope):
-- Multiple DML triggers
DROP TRIGGER IF EXISTS trgEmployeeInserted, trgEmployeeUpdated, trgEmployeeDeleted;
-- Multiple database-scope DDL triggers
DROP TRIGGER IF EXISTS LogTableCreation, LogTableDeletion
ON DATABASE;
-- Multiple server-scope DDL or logon triggers
DROP TRIGGER IF EXISTS AuditCreate, AuditDrop
ON ALL SERVER;
SQL Server Management Studio also offers a GUI path:
- Open Object Explorer.
- Expand Databases → YourDatabase → Tables → YourTable → Triggers.
- Right-click the trigger and choose Delete.
- Click OK in the confirmation dialog.
SSMS runs the equivalent DROP TRIGGER statement for you. The script form is preferred for repeatability — you can put it in a deployment script and re-run it as needed.
| Question | DISABLE TRIGGER | DROP TRIGGER |
|---|---|---|
| Trigger stops firing? | Yes | Yes |
| Definition kept? | Yes | No (gone permanently) |
| Reversible? | Yes (ENABLE TRIGGER) | No (must recreate) |
| Best for | Temporary pause | Permanent removal |
After dropping, confirm the trigger is gone by querying system catalogs:
-- DML and database-scope DDL triggers
SELECT name FROM sys.triggers
WHERE name = 'trgAddressAudit';
-- Server-scope DDL triggers
SELECT name FROM sys.server_triggers
WHERE name = 'AuditDatabaseCreation';
An empty result confirms the trigger has been removed.
- Always use
IF EXISTS— makes scripts idempotent and safe to re-run. - Prefer
DISABLEwhen you might need the trigger later. Dropping then recreating loses the trigger's edit history; disabling preserves it. - Save the trigger's source before dropping if there's any chance you'll want it back.
sp_helptext 'trigger_name'dumps the source code; save it to a file or version control. - Drop triggers in dependency order. If trigger A inserts into a logging table that trigger B fires on, drop A first.
- Coordinate with replication, change data capture, and other features that may have created triggers automatically — never drop triggers you didn't create unless you understand them.
DROP TRIGGERpermanently removes a trigger and its definition; the action is irreversible.- Three syntax forms based on scope: DML triggers (no scope clause),
ON DATABASE, orON ALL SERVER. - Always include
IF EXISTSfor safe, idempotent scripts. - Drop multiple triggers at once with a comma-separated list — same scope only.
- For temporary suspension, use
DISABLE TRIGGERinstead — same effect on firing, but the definition stays. - Confirm drops via
sys.triggers/sys.server_triggers; save the source first if there's any chance you'll need it again.