Archive
Sql Server useful commands
Coming…
Logging by Triggers in SQL Server
We can alternatively use SQL Server feature CDC (Change Data Capture), but here I am providing one more way of doing it (custom solution).
Db Objects: (two tables and two triggers)
- TargetTableName: Table whose data we want to log
- LogTableName: Table where data will be logged. This table structure will be same as TargetTableName, and additionally this table will have three extra columns namely
- [log_action_type]
- [log_action_date]
- [log_action_user]
- [log_action_hostname]
- tl_TargetTableName: Trigger to log DML changes (Update and Delete only)
- tu_LogTableName: Trigger to avoid Delete or Update operations operations on logging table
use dbname go alter table LogTableName add [log_action_type] [char](1) not null; alter table LogTableName add [log_action_date] [datetime] not null default getdate(); alter table LogTableName add [log_action_user] [varchar](50) null; alter table LogTableName add [log_action_hostname] [varchar](50) default host_name(); go IF OBJECT_ID ('dbo.tu_LogTableName ','TR') IS NOT NULL DROP TRIGGER dbo.tu_LogTableName; GO -- ============================================= -- Author: Umesh Patil -- Create date: 2014/08/26 -- Description: Restirct Delete or Update operations operations on logging table -- ============================================= CREATE TRIGGER dbo.tu_LogTableName ON dbo.LogTableName FOR DELETE,UPDATE AS BEGIN RAISERROR ('Can not perform Delete or Update operations on UserTableName table, either disable/delete the trigger',16,1); ROLLBACK TRANSACTION; RETURN; END GO use dbname go IF OBJECT_ID ('dbo.tl_TargetTableName','TR') IS NOT NULL DROP TRIGGER dbo.tl_TargetTableName; GO -- ============================================= -- Author: Umesh Patil -- Create date: 2014/08/26 -- Description: Log DML changes (Update and Delete only) -- ============================================= CREATE TRIGGER dbo.tl_TargetTableName ON dbo.TargetTableName FOR DELETE,UPDATE AS BEGIN SET NOCOUNT ON; DECLARE @ActionType char(1) IF EXISTS (SELECT 1 FROM deleted) BEGIN IF EXISTS(SELECT 1 FROM inserted) SET @ActionType='U' ELSE SET @ActionType='D' END IF @ActionType='U' OR @ActionType='D' INSERT INTO [dbo].[TargetTableName] ([PrimaryKey_Column] --include all columns ,[log_action_type] ,[log_action_date] ,[log_action_user] ,[log_action_hostname]) select [PrimaryKey_Column] --include all columns ,@ActionType as [log_action_type] ,getdate() as [log_action_date] ,suser_sname() as [log_action_user] ,host_name() as [log_action_hostname] from deleted END GO
Find Non-ASCII character in SQL Server
Here is a simple command to find character.
SELECT NOTES ,patindex('%[' + CHAR(127)+ '-' +CHAR(255)+']%' COLLATE Latin1_General_BIN,NOTES) as [Position] ,substring(NOTES,patindex('%[' + CHAR(127)+ '-' +CHAR(255)+']%' COLLATE Latin1_General_BIN,NOTES),1) as [InvalidCharacter] ,ascii(substring(NOTES,patindex('%[' + CHAR(127)+ '-' +CHAR(255)+']%' COLLATE Latin1_General_BIN,NOTES),1)) as [ASCIICode] FROM tablename (NOLOCK) WHERE Notes LIKE '%[' + CHAR(127)+ '-' +CHAR(255)+']%' COLLATE Latin1_General_100_BIN2
Hope it helps.
Regards,
Umesh
Understand Response Time vs. Total Time in SQL
Response time is the time it takes for a query to return the first record. Total time is the time it takes for the query to return all records. For an interactive application, response time is important because it is the perceived time for the user to receive visual affirmation that a query is being processed. For a batch application, total time reflects the overall throughput. You have to determine what the performance criteria are for your application and queries, and then design accordingly.