Solved

SQL trigger, checking if table exists

Posted on 2010-09-02
4
369 Views
Last Modified: 2012-06-22
This trigger does not work, but the query does. I need the trigger to check if the table exists if not, it will create it.
/****** Object:  DdlTrigger [trgMonitorChange]    Script Date: 06/03/2010 08:26:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

create TRIGGER [trgMonitorChange]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
------------------------------
if exists(select * from tempdb.sys.tables where name ='##MonitorChange')
begin
--print 'Table ##MonitorChange does exists, record inserted.'
      set nocount on
      declare @EventType varchar(100)
      declare @SchemaName varchar(100)
      declare @ObjectName varchar(100)
      declare @ObjectType varchar(100)
      SELECT
       @EventType = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)')  
      ,@SchemaName = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(max)')  
      ,@ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')
      ,@ObjectType = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(max)')  
      -- Is the default schema used
      if @SchemaName = ' ' select @SchemaName = default_schema_name from sys.sysusers u join sys.database_principals p
                                          on u.uid = p.principal_id  where u.name = CURRENT_USER
      insert into ##MonitorChange
              select @@servername,convert(varchar(100),DB_NAME()), @EventType, @SchemaName, @ObjectName, @ObjectType, getdate(), SUSER_SNAME(), CURRENT_USER, ORIGINAL_LOGIN()  
end
else
begin
--print 'Table ##MonitorChange does not exist, Table ##MontitorChange created, record inserted.'
      SET ANSI_NULLS ON
      SET QUOTED_IDENTIFIER ON
      SET ANSI_PADDING ON
      CREATE TABLE [dbo].[##MonitorChange](
            [Server_Name] [varchar](100) NULL,
            [DB_Name] [varchar](100) NULL,
            [EventType] [varchar](100) NULL,
            [SchemaName] [varchar](100) NULL,
            [ObjectName] [varchar](100) NULL,
            [ObjectType] [varchar](100) NULL,
            [EventDate] [datetime] NULL,
            [SystemUser] [varchar](100) NULL,
            [CurrentUser] [varchar](100) NULL,
            [OriginalUser] [varchar](100) NULL
      ) ON [PRIMARY]
      
      ------------------------------
      ------------------------------
--set nocount on
--declare @EventType1 varchar(100)
--declare @SchemaName1 varchar(100)
--declare @ObjectName1 varchar(100)
--declare @ObjectType1 varchar(100)
SELECT
 @EventType = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)')  
,@SchemaName = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(max)')  
,@ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')
,@ObjectType = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(max)')  
-- Is the default schema used
if @SchemaName = ' ' select @SchemaName = default_schema_name from sys.sysusers u join sys.database_principals p
                        on u.uid = p.principal_id  where u.name = CURRENT_USER
insert into ##MonitorChange
      select @@servername,convert(varchar(100),DB_NAME()), @EventType, @SchemaName, @ObjectName, @ObjectType, getdate(), SUSER_SNAME(), CURRENT_USER, ORIGINAL_LOGIN()  
--SET ANSI_PADDING OFF      
end
go
------------------------------
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [trgMonitorChange] ON DATABASE
0
Comment
Question by:asullivan62
  • 2
  • 2
4 Comments
 

Author Comment

by:asullivan62
ID: 33590946
The table is never created if executed in a trigger.
0
 
LVL 5

Accepted Solution

by:
almander earned 500 total points
ID: 33591719
Use

IF OBJECT_ID('tempdb..##MonitorChange'') IS NOT NULL

instead of

if exists(select * from tempdb.sys.tables where name ='##MonitorChange')
0
 

Author Closing Comment

by:asullivan62
ID: 33591998
Well I am not sure why that made the difference but it did and it works great now thanks.
0
 
LVL 5

Expert Comment

by:almander
ID: 33592316
For some crazy reason all flavors of temp tables are not stored in sys.tables, sysobjects, or information_schema.

The kicker is that ObjectId will work for any object. And also takes an optional parameter to specify the object type.

I.E.
OBJECT_ID('tempdb..##MonitorChange'', 'U')

http://msdn.microsoft.com/en-us/library/ms190324.aspx
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this article I will describe the Detach & Attach method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question