Sie möchten wahrscheinlich keinen INSTEAD OF
Trigger, außer Sie möchten die tatsächliche Einfügung oder Aktualisierung ersetzen. In Ihrem Fall möchten Sie stattdessen einen FOR INSERT, UPDATE
Auslöser.
Dieser Beispieltrigger gibt eine Nachricht an den Client aus, wenn jemand versucht, Daten in der titles-Tabelle hinzuzufügen oder zu ändern.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'reminder' AND type = 'TR')
DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE
AS RAISERROR ('inserts and updates to the titles table is not allowed', 16, 1)
GO
Sie können auch Dinge wie IF EXISTS
oder COLUMNS_UPDATED
auch verwenden.
Hier ein weiteres Beispiel, das Rollback verwendet.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'employee_insupd' AND type = 'TR')
DROP TRIGGER employee_insupd
GO
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @min_lvl tinyint,
@max_lvl tinyint,
@emp_lvl tinyint,
@job_id smallint
SELECT @min_lvl = min_lvl,
@max_lvl = max_lvl,
@emp_lvl = i.job_lvl,
@job_id = i.job_id
FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id
JOIN jobs j ON j.job_id = i.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
BEGIN
RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
ROLLBACK TRANSACTION
END
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
BEGIN
RAISERROR ('The level for job_id:%d should be between %d and %d.',
16, 1, @job_id, @min_lvl, @max_lvl)
ROLLBACK TRANSACTION
END
Ich bin mir nicht sicher, ob Sie eine Transaktion haben oder nicht, aber in Ihrem Fall würden Sie so etwas wie die folgenden wollen:
USE myDatabase
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'myTable' AND type = 'TR')
DROP TRIGGER tr_myTrigger
GO
CREATE TRIGGER tr_myTrigger
ON myTable
FOR INSERT, UPDATE
AS
if(exists(select * from inserted where rtrim(c) <> ''))
begin
-- check to make sure the insert(s) are unique
if(exists(
select * from inserted i
join dbo.myTable t on i.a = t.a and i.b = t.b and i.c = t.c)
begin
raiserror('Duplicate(s) found', 16, 1)
rollback transaction
end
end
Was ist die Natur der „precheck“? Trigger haben einen Overhead, der die "eingefügten"/"gelöschten" Tabellen verwaltet. Ist es etwas, das anders durchgesetzt werden kann? –
Alles, was wir brauchen, ist eine eindeutige Beschränkung für Tripel (3 Spalten), die leere Strings in einer Spalte ignorieren. – Cartesius00
Also für Tupel '(a, b, c)' wenn 'c' einen Wert für eine leere Zeichenkette hat, wollen Sie dieses Tupel für die Zwecke der einzigartigen Einschränkung vollständig ignorieren? –