Monday, 23 January 2017

Dynamically Multiple Table Trigger Created In Sql Server

CREATE PROC TABLE_TRIGGER
@TABLENAME VARCHAR(MAX)=''
AS 
BEGIN
DECLARE @DATABASECONNECTION VARCHAR(MAX)=''
BEGIN

BEGIN TRY
BEGIN TRAN

DECLARE @COLUMLIST VARCHAR(MAX)
DECLARE @PRIMARYKEY VARCHAR(MAX)
DECLARE @DESTINATIONCOL VARCHAR(MAX)

SELECT @COLUMLIST = COALESCE(@COLUMLIST,'','') + name +',' FROM sys.columns WHERE OBJECT_NAME(object_id) = @TABLENAME
SELECT @PRIMARYKEY = COALESCE(@PRIMARYKEY,'','') +'Sou.' + COL_NAME(object_id,index_id) 
 +'= Dest.' + COL_NAME(object_id,index_id)
FROM sys.indexes WHERE OBJECT_NAME(object_id) = @TABLENAME

SET @COLUMLIST = SUBSTRING(@COLUMLIST,0,LEN(@COLUMLIST))
SET @DESTINATIONCOL = CHAR(13)
SELECT @DESTINATIONCOL = COALESCE(@DESTINATIONCOL,'','') + CHAR(9)+ CHAR(9)+ CHAR(9) + 'Dest.' + Col.NAME + ' = Sou.' + Col.NAME + ', '+ CHAR(13)
FROM   SYS.OBJECTS Obj 
LEFT JOIN SYS.COLUMNS Col 
ON Col.OBJECT_ID = Obj.OBJECT_ID 
 WHERE  Obj.NAME = @TABLENAME 
 ORDER  BY COLUMN_ID 

SET @DESTINATIONCOL = SUBSTRING(@DESTINATIONCOL,0,LEN(@DESTINATIONCOL)-2)

DECLARE @sql NVARCHAR(MAX) = 'CREATE TRIGGER TR_'+ @TABLENAME + '_MYTRIGGER ON '+@TABLENAME+'
AFTER INSERT,UPDATE,DELETE AS 
BEGIN 
MERGE INTO ' + @DATABASECONNECTION + @TABLENAME +' As Dest
USING 

SELECT '+ @COLUMLIST+ ' FROM INSERTED 
) AS Sou ON '+ @PRIMARYKEY + ' 
WHEN MATCHED THEN
UPDATE SET ' 
+CHAR(9) + @DESTINATIONCOL +  CHAR(13)+
CHAR(9)+ ' WHEN NOT MATCHED THEN
INSERT('+ @COLUMLIST +')
VALUES ('+ @COLUMLIST +');
END'

SELECT @sql
COMMIT TRAN
END TRY
BEGIN CATCH
RAISERROR('Trigger Not Created !!', 18, 1)
ROLLBACK TRAN
END CATCH
END
END 


#Multiple Table Trigger 

CREATE PROCEDURE MULTIPLE_TABLE_TRIGGER
(
@TABLELIST VARCHAR(MAX)=''
)
AS
BEGIN
DECLARE @TABLENAME VARCHAR(MAX)
DECLARE TABLE_CURSOR CURSOR FOR SELECT
Value FROM dbo.Split(@TABLELIST,',')

OPEN Tbl_Cur
IF @@CURSOR_ROWS > 0
BEGIN
FETCH NEXT FROM Tbl_Cur INTO @TABLENAME
WHILE @@FETCH_STATUS = 0
BEGIN 
EXEC TABLE_TRIGGER 
@TABLENAME = @TABLENAME
FETCH NEXT FROM Tbl_Cur INTO @TABLENAME
END 
END 
CLOSE TABLE_CURSOR
DEALLOCATE TABLE_CURSOR

END

No comments:

Post a Comment