Technical Article

Checks Triggers status on User- Databases.

,

Introduction:

SQL Server 7.0 introduced a new class of functions that return a wide range of property information that isn't readily available in SQL Server 6.5 and earlier versions.
These functions have three general classes: TypeProperty, which returns information about a data type;
ObjectProperty, which returns information about objects in the current database; and ColumnProperty, which returns information about a column or procedure parameter.
Together, these classes include dozens of property values you can query for database objects. Base on these power full class of function, I have put to gether a stored procedure that searches through user databases and
identify all disabled triggers in a particular database:

Audience:  DBA / SA.

use master
go

Create proc [dbo].[P_ZDBA_TRIGGER_STATUS_CHK]  @fpath varchar(255),@Email_address Varchar(50)
as
--*************************************************************************************************************************************                  
-- Date Created/User:06/24/2002 By Wali A. Ali .                                                
--
--SQL Server 7.0 introduced a new class of functions that return a wide range of property information 
--that isn't readily available in SQL Server 6.5 and earlier versions. 
--These functions have three general classes: TypeProperty, which returns information about a data type; 
--ObjectProperty, which returns information about objects in the current database; and 
--ColumnProperty, which returns information about a column or procedure parameter. 
--Together, these classes include dozens of property values you can query for database objects. 
--Base on these power full class of function. This stored procedure is written to search through user databases and 
--identify all disabled triggers in a particular database:
-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- The procedure is located in Database Mgt\Client\DBA Maintenance Utilities                   
--                                                                                              
-- Utility Name:       P_ZDBA_TRIGGER_STATUS_CHK                                                
--                                                                                              
-- Category:         General T-SQL, Stored Procedure                                            
--                                                                                              
-- Utility Location: DBAMNT database on each Server.                                        
--                                                                                              
-- Execution description or syntax:  P_ZDBA_TRIGGER_STATUS_CHK  'f:\apps\dat\','SQLDBA'         
--                                                                                               
-- Result:           A Log file for each database in the following format is written;           
--                       [yyyymmddhhmm}_{Server-name}_TRGCHK.log]                       
--                                                                                               
-- Audience:         DBA                                                                           
--                                                                                              
-- Date Created: June, 2002                                                                 
--
-- Updates/Changes: Updated By      Reason
--------------------------------    -----------------      --------------------------------------------------------------------------------------------------------------
-- 6/24/02                       Wali. Ali          Original                                     
--------------------------------    -----------------      --------------------------------------------------------------------------------------------------------------             
-- Input Parameters:@PATH    varchar [Location where the TRIGGER CHECK log file will be written]
--
--@Email_address   varchar [Email address for the SQL DBAs. The 
--                                       procedure will send out e-mails to all DBAs when there is a disabled TRIGGER found for one or more  
--                                       user database.                  
--
-- Output Parameters:None
--
-- Called By:Normally invoked by a scheduled SQL Agent Job.                                                                     
--
-- Description/(Purpose): This stored procedure is written to search through user databases and 
--                                   identify all disabled triggers in a particular database:
-- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Step by Step details:    
--
--    1:  Old TRIGER  log files for each database is removed, before the routine is started. 
--
--    2: All system databases are bypassed. [master, tempdb, model, msdb, pubs, northwind, distribution ]                                                                                               
--
--    3: The Log file showing the trigger status--[0 normal and 1 disabled trigger] is generated regardless. 
--                         
--    4:  When one or more trigger with status of 1 is found, the row(s)  is copied to a static work user table, 
--         and E-mail is composed to all SQL-DBA.  
--    
--  **************************************************************************************************************************************
SET NOCOUNT ON
SET QUOTED_IDENTIFIER OFF
SET ANSI_DEFAULTS OFF

Declare @command         as varchar(500),
            @sqlstmt             as varchar(500),
            @temptime          as varchar(21),
            @path                 as  varchar(500),       
            @SQLSTR          as varchar(500)

-- Step1: Delete  old log file
declare @delstmt as varchar(200)
set       @delstmt =  ' Del /q '  +  @fpath + '*_TRGCHK.log'
exec    @sqlstmt = master..xp_cmdshell  @delstmt

        
-- Create new log file-- [yyyymmddhhmm}_{Server-name}_TRGCHK.log]
SET @temptime=CONVERT(CHAR(21),GETDATE(),108)    -- 108 style
SET @temptime=SUBSTRING(@temptime,1,2)+SUBSTRING(@temptime,4,2)
--select @temptime --debugging
SET  @temptime=convert(char(8),getdate(),112)+@temptime  --112 style
-- select @temptime --debugging
SET  @path = @fpath  
SET  @path = @path  + @temptime  
SET  @path = @path + '_'
SET  @path = @path + '_' +@@servername+ '_' + '_TRGCHK.log'
select @path

-- drop and re-create global temp and work table.
if exists (select 1  from INFORMATION_SCHEMA.TABLES where table_schema = 'dbo' and table_name = 'disabled' and table_type = 'BASE TABLE')
  drop table disabled
if exists (select 1  from tempdb.INFORMATION_SCHEMA.TABLES where table_schema = 'dbo' and table_name like '##triggers' and table_type = 'BASE TABLE')
  drop table ##triggers

Begin
create table ##triggers (DB_Name sysname,  Trigger_Status int, Trigger_Name varchar(40),  Create_date datetime ) 
create table DBAMNT.dbo.disabled (DB_Name varchar(30),  Disabled_Trigger_Status int, Trigger_Name varchar(40),  Create_date datetime) 
End

exec sp_MSforeachdb '  USE ? insert into ##triggers SELECT "?" as ''DB-NAME'',OBJECTPROPERTY(object_id(obj.name),''ExecIsTriggerDisabled'') As ''Enable(0), DISable(1)'',right(obj.name,35) as ''Trigger Name'',
obj.crdate  as ''Create_Date'' FROM ?..sysobjects obj, master.dbo.sysdatabases db WHERE type = ''tr'' and db.name = ''?'' and db.name not  in (''master'' ,''model'' ,''tempdb'',  ''msdb'',''pubs'',''Northwind'', ''distribution'') and objectproperty(id,''IsMSShipped'') = 0 '

-- Step2: Write the contents of #triggers out to Trigger log.
SET @SQLSTR = '''BCP "SELECT right(DB_Name,30) as DB_Name, cast(Trigger_Status AS CHAR(1)), right(Trigger_Name,40), convert(char(21),create_date,100) from ##triggers " queryout ' + @path+'  -k -c -S'+@@servername+'  -T'''
SET @command  = 'echo * >> '  + @path
set @command    = 'master..xp_cmdshell ' 
set @command    = @command + @SQLSTR 
select @command
exec(@command)

-- check Triggers that might have disabled status--1 for any database.
Begin
insert into [DBAMNT].[dbo].[disabled] 
 select right(DB_Name,30) as DB_Name, Trigger_Status, Trigger_Name, create_date from ##triggers where Trigger_status = 1
end

select * from [DBAMNT].[dbo].[disabled]  -- during debugging.

-- If any trigger found with disabled status--1, notify  DBA unit via SQL-mail and the contents of disabled temp static table is attached.
declare @errcnt as int,
            @rcnt    as int
Begin
set @errcnt = (select count(*) from [DBAMNT].[dbo].[disabled]) 
set @rcnt   = @@rowcount
    if (@errcnt <> 0 and @rcnt <> 0)
      Begin
        SET NOCOUNT on
        SET @command = 'echo * >> ' + @path
        EXEC master.dbo.xp_cmdshell @command,NO_OUTPUT
        SET  @command= 'echo !!!! ERROR-TRIGGER: Disabled Trigger(s) found !!!!  >> '  + @path
        EXEC master.dbo.xp_cmdshell @command,NO_OUTPUT
        set  @sqlstmt = 'ERROR-TRIGGER: Disabled Trigger(s) found'
        set  @sqlstmt = @sqlstmt + ' ON: ' + UPPER(@@servername) 

-- Now Compose the E-mail notification 
Declare @dbname as varchar(30) 
set @dbname  = 'DBAMNT'
 exec master..xp_sendmail 
          @recipients     = @Email_address,
          @dbuse          = @dbname,
          @Query          = ' select * from [DBAMNT].[dbo].[disabled]',
          @message        = 'ERROR-TRIGGER: Disabled Triggers(s) Found, Check the Attachedment.',
          @subject            = @sqlstmt, 
          @attach_results = 'TRUE', @width = 250
       End
     Else
        SET  @command  = 'echo !!!! NO Disabled TRIGGERS are found !!!!  >> '  + @path
        EXEC master.dbo.xp_cmdshell @command,NO_OUTPUT

/* Last thing to do is to remove the disabled temp static table  and one temp table*/if exists (select 1  from DBAMNT.INFORMATION_SCHEMA.TABLES where table_schema = 'dbo' and table_name = 'disabled' and table_type = 'BASE TABLE')
  drop table disabled
if exists (select 1  from tempdb.INFORMATION_SCHEMA.TABLES where table_schema = 'dbo' and table_name like '##triggers' and table_type = 'BASE TABLE')
  drop table ##triggers
END
Return (@@error) --end of P_Z_DBA_TRIGGER_STATUS_CHK

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Rate

Share

Share

Rate