# Preventing deletes at the database level
## Create a function for a trigger that will refuse to delete 'default'
```sql=
CREATE OR REPLACE FUNCTION protect_default() RETURNS TRIGGER as $protect_default$
BEGIN
IF OLD.name = 'default' THEN
RAISE EXCEPTION 'Cannot delete default test';
END IF;
RETURN OLD;
END;
$protect_default$ LANGUAGE plpgsql;
```
## Create a table that uses that function at ON-DELETE time
```sql=
CREATE TABLE test (
id INTEGER PRIMARY KEY,
name varchar(40) NOT NULL
);
CREATE TRIGGER protect_default BEFORE DELETE ON test
FOR EACH ROW EXECUTE FUNCTION protect_default();
```
## Fill the table with values
```sql=
INSERT INTO test (id, name)
VALUES
(1, 'default'),
(2, 'test2'),
(3, 'test3');
```
## Try to delete "default"
```sql=
DELETE FROM test WHERE name = 'default';
DELETE FROM test WHERE name = 'test2';
```
## Run-time example:
```sql=
pulp=> CREATE OR REPLACE FUNCTION protect_default() RETURNS TRIGGER as $protect_default$
BEGIN
IF OLD.name = 'default' THEN
RAISE EXCEPTION 'Cannot delete default test';
END IF;
RETURN OLD;
END;
$protect_default$ LANGUAGE plpgsql;
CREATE FUNCTION
pulp=> CREATE TABLE test (
id INTEGER PRIMARY KEY,
name varchar(40) NOT NULL
);
CREATE TRIGGER protect_default BEFORE DELETE ON test
FOR EACH ROW EXECUTE FUNCTION protect_default();
CREATE TABLE
CREATE TRIGGER
pulp=> INSERT INTO test (id, name)
VALUES
(1, 'default'),
(2, 'test2'),
(3, 'test3');
INSERT 0 3
pulp=> select * from test;
id | name
----+---------
1 | default
2 | test2
3 | test3
(3 rows)
pulp=> DELETE FROM test WHERE name = 'default';
ERROR: Cannot delete default test
CONTEXT: PL/pgSQL function protect_default() line 4 at RAISE
pulp=> select * from test;
id | name
----+---------
1 | default
2 | test2
3 | test3
(3 rows)
pulp=> DELETE FROM test WHERE name = 'test2';
DELETE 1
pulp=> select * from test;
id | name
----+---------
1 | default
3 | test3
(2 rows)
pulp=>
```