Link to home
Start Free TrialLog in
Avatar of asullivan62
asullivan62Flag for United States of America

asked on

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
Avatar of asullivan62
asullivan62
Flag of United States of America image

ASKER

The table is never created if executed in a trigger.
ASKER CERTIFIED SOLUTION
Avatar of almander
almander

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Well I am not sure why that made the difference but it did and it works great now thanks.
Avatar of almander
almander

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