If you want to do this as an INSTEAD OF trigger, the INSERT trigger should look like this outline:
CREATE TRIGGER MyTrigger ON MyTable INSTEAD OF INSERT AS
IF NOT EXISTS (SELECT * FROM inserted) RETURN
IF <bad condition is true>
BEGIN
RAISERROR('Blue murder!', 16, 1)
ROLLBACK TRANSACTION
RETURN
END
INSERT tbl (col1, col2, col3, ....)
SELECT col1, co2, col3, ...
FROM inserted
Since repeating the INSERT statement is kind of boring and opens for a maintenance problem, most people do this as an AFTER trigger. But if you expect the bad condition to appear often, it cannot be denied that the INSTEAD OF trigger is more efficient.
Note: Never do COMMIT TRANSACTION in a trigger, that will not end well!