CREATE TRIGGER <schema>.<tablename>$[InsteadOf]<actions>[<purpose>]Trigger ON <schema>.<tablename> [AFTER|INSTEAD OF] <comma delimited actions> AS BEGIN DECLARE @rowsAffected INT, --stores the number of rows affected @msg VARCHAR(2000) --used to hold error message SET @rowsAffected = @@ROWCOUNT IF @rowsAffected = 0 RETURN SET NOCOUNT ON --to avoid the rowcount messages SET ROWCOUNT 0 --in case client has modified the rowcount BEGIN TRY --[validation section] --[modification section] --[perform action] --for INSTEAD OF trigger END TRY BEGIN CATCH IF @@trancount > 0 ROLLBACK TRANSACTION --log the error EXECUTE utility.ErrorLog$insert --this is only one example to do logging DECLARE @ERROR_MESSAGE NVARCHAR(4000) SET @ERROR_MESSAGE = ERROR_MESSAGE() RAISERROR (@ERROR_MESSAGE, 16, 1) END CATCH END
Below is an example of using a table and a procedure to do error logging:
CREATE TABLE utility.ErrorLog( ERROR_NUMBER int NOT NULL, ERROR_LOCATION sysname NOT NULL, ERROR_MESSAGE varchar(4000), ERROR_DATE datetime NULL CONSTRAINT dfltErrorLog_error_date DEFAULT (getdate()), ERROR_USER sysname NOT NULL --use original login to capture the user name of the actual user --not a user that has been impersonated CONSTRAINT dfltErrorLog_error_user_name DEFAULT (original_login()) ) GO CREATE PROCEDURE utility.ErrorLog$insert ( @ERROR_NUMBER int = NULL, @ERROR_LOCATION sysname = NULL, @ERROR_MESSAGE varchar(4000) = NULL ) AS BEGIN BEGIN TRY INSERT INTO utility.ErrorLog(ERROR_NUMBER, ERROR_LOCATION, ERROR_MESSAGE) SELECT ISNULL(@ERROR_NUMBER, ERROR_NUMBER()), ISNULL(@ERROR_LOCATION, ERROR_MESSAGE()), ISNULL(@ERROR_MESSAGE, ERROR_MESSAGE()) END TRY BEGIN CATCH INSERT INTO utility.ErrorLog(ERROR_NUMBER, ERROR_LOCATION, ERROR_MESSAGE) VALUES (-100, 'utility.ErrorLog$insert', 'An invalid call was made to the error log procedure') END CATCH END
Reference:
Pro SQL Server 2008 Relational Database Design and Implementation - Louis Davidson