0
Does anyone know how to register Insert/delete/update performed in the database outside the application or restricting by user?
For example only via Sqlmanager only,
The Database is SQL Server 2014;
0
Does anyone know how to register Insert/delete/update performed in the database outside the application or restricting by user?
For example only via Sqlmanager only,
The Database is SQL Server 2014;
0
Without using audit, only via Trigger. Using this Trigger creation model via SQL Dynamico, Voce can monitor actions.
Create your _LOG table first and add below.
DECLARE @tablename VARCHAR(100)
DECLARE @audittable VARCHAR(100)
DECLARE @sqlInsert VARCHAR(MAX)
DECLARE @sqlColumns VARCHAR(MAX)
DECLARE @sqlJoin VARCHAR(MAX)
DECLARE @sqlWhere VARCHAR(MAX)
DECLARE @sqlWhereFinal VARCHAR(MAX)
DECLARE @sqlHeader VARCHAR(MAX)
DECLARE @quote CHAR(1)
SET @quote = CHAR(39)
SET @tablename = 'SUA_TABELA' --Replace this with the table name for which you want to write the update trigger
SET @audittable = 'SUA_TABELA_LOG' --Replace this with the audit table you want to insert the changed data
--this is just the header info for the trigger
SET @sqlHeader = 'IF OBJECT_ID('+@quote+''+@tablename+'_U'+@quote+') IS NOT NULL
DROP TRIGGER dbo.'+@tablename+'_U
GO
CREATE TRIGGER dbo.'+@tablename+'_U
ON dbo.'+@tablename+' FOR update
/**************************************************************
* Update trigger for '+@tablename+'
*
* MODIFICATIONS
* 01/01/2000 xxx New
**************************************************************/
AS '
PRINT @sqlHeader
--select insert into
SELECT @sqlInsert = COALESCE(@sqlInsert+' ,' , '') + name + CHAR(13)+ CHAR(9) FROM sys.syscolumns WHERE OBJECT_NAME(id) = @tablename ORDER BY colid
SET @sqlInsert = 'insert into dbo.'+@audittable+'('+CHAR(13) +CHAR(9)+@sqlInsert +')'
PRINT @sqlInsert
-- select col list
SELECT @sqlColumns = COALESCE(@sqlColumns+' ,' , '') +'d.'+ name + CHAR(13) + CHAR(9) FROM sys.syscolumns WHERE OBJECT_NAME(id) = @tablename ORDER BY colid
SET @sqlColumns = 'select '+CHAR(13) +CHAR(9)+ @sqlColumns
--strip the last linebreak
SET @sqlColumns = LEFT(@sqlColumns, (LEN(@sqlColumns)-2))
PRINT @sqlColumns
--generate the join condition between Inserted and Deleted tables if the table has Primary key
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE table_name = @tablename AND constraint_name LIKE '%PK%')
BEGIN
SET @sqlJoin = ''
SELECT @sqlJoin = COALESCE(@sqlJoin , '') + 'd.'+ column_name + ' = i.'+ column_name + CHAR(13)+CHAR(9) +' and ' FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE table_name = @tablename AND constraint_name LIKE '%PK%'
SET @sqlJoin = 'from ' + CHAR(13) + CHAR(9) + ' deleted d join inserted i on ' + @sqlJoin
--strip off the last 'and'
SET @sqlJoin = LEFT(@sqlJoin, (LEN(@sqlJoin)-6))
END
ELSE
SET @sqlJoin = 'from deleted d, inserted i'
PRINT @sqlJoin
--generate the != clause where you check if atleast one column is changed...
DECLARE @coltype VARCHAR(100)
DECLARE @colname VARCHAR(100)
SET @sqlWhereFinal = 'where'
DECLARE colcursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT st.name, sc.name
FROM sys.syscolumns sc JOIN sys.systypes st ON sc.xtype = st.xtype
WHERE OBJECT_NAME(sc.id) = @tablename AND sc.name NOT IN
(SELECT column_name FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE table_name = @tablename AND constraint_name LIKE '%PK%')
OPEN colcursor
FETCH next FROM colcursor INTO @coltype , @colname
WHILE @@fetch_status = 0
BEGIN
SET @sqlWhere = ''
PRINT @sqlWhereFinal
SET @sqlWhereFinal = ''
SET @sqlWhere = CASE WHEN @coltype IN('smalldatetime','datetime','sql_variant','ntext','varbinary','varchar','binary','char','timestamp','nvarchar','nchar','xml','sysname')
THEN @sqlWhere + CHAR(9) + 'isnull(d.'+ @colname +','''') != isnull(i.'+ @colname + ','''') or'
ELSE
@sqlWhere + CHAR(9) + 'isnull(d.'+ @colname +',-1) != isnull(i.'+ @colname + ',-1) or'
END
SET @sqlWhereFinal = @sqlWhereFinal + @sqlWhere
FETCH next FROM colcursor INTO @coltype , @colname
END
CLOSE colcursor
DEALLOCATE colcursor
--remove the last 'or'
SET @sqlWhereFinal = LEFT(@sqlWhereFinal, (LEN(@sqlWhereFinal)-3))
PRINT @sqlWhereFinal
0
The change data capture (CDC) is an option; you had the opportunity to read the article SQL Server Security Audit Basics?
The subject is extensive to address in forum topic, but there are several articles on the web that deal with audit.
There are specific ready scripts for audit, that you can adapt to what you need.
Browser other questions tagged sql-server
You are not signed in. Login or sign up in order to post.
I found that I can perform monitoring by Trigger or by change data capture of SQL server, there are other options, or some observation regarding them?
– Guisal