Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 418
  • Last Modified:

SQL trigger, checking if table exists

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
asullivan62
Asked:
asullivan62
  • 2
  • 2
1 Solution
 
asullivan62Author Commented:
The table is never created if executed in a trigger.
0
 
almanderCommented:
Use

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

instead of

if exists(select * from tempdb.sys.tables where name ='##MonitorChange')
0
 
asullivan62Author Commented:
Well I am not sure why that made the difference but it did and it works great now thanks.
0
 
almanderCommented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now