使用Cursor为数据库中的所有表创建触发器

时间:2016-06-16 12:22:16

标签: triggers cursor

我正在使用SQL Server 2005

我正在尝试为数据库中包含的每个表创建一个触发器并继续收到我不理解且无法修复的错误

如果有人知道我为什么会收到这个错误,或者我如何解决这个问题就会很棒。

DECLARE @TableName AS VARCHAR(100)
DECLARE @audit_action as varchar(100)

DECLARE RDS_cusor CURSOR FOR
SELECT TABLE_NAME FROM [RawDataStorage].INFORMATION_SCHEMA.Tables WHERE TABLE_NAME LIKE 't_%' AND TABLE_NAME NOT LIKE 'tbl_%'

OPEN RDS_cursor
FETCH NEXT FROM RDS_cursor INTO @TableName

WHILE @@FETCH_STATUS = 0   
BEGIN 

CREATE TRIGGER dbo.After_Insert_Trig
ON  [dbo].[t_Agent]
AFTER INSERT,DELETE,UPDATE
AS 
BEGIN

SET NOCOUNT ON;

INSERT INTO RawDataStorage_Audit
(TableName,Audit_Action,Audit_Timestamp) 
VALUES('TableName','audit_action',getdate());

END
GO

FETCH NEXT FROM RDS_cursor INTO @TableName

END   

CLOSE RDS_cursor   
DEALLOCATE RDS_cursor

这是我得到的错误:

第15行,第15行,第1行,第15行 关键字' TRIGGER'附近的语法不正确。 Msg 102,Level 15,State 1,Line 26 ' END'附近的语法不正确。 Msg 137,Level 15,State 2,Line 2 必须声明标量变量" @ TableName"。

任何帮助都会得到很大的帮助

1 个答案:

答案 0 :(得分:0)

我设法将它放在一起,它是一个动态查询,它构建sql以使用游标从sysobjects中获取表名来创建触发器。

CREATE TABLE [dbo].[RawDataStorage_Audit](
            ID INT IDENTITY(1,1) NOT NULL,
            TableName VARCHAR(50) NULL,
            audDateLastChanged DATETIME null
  )          


Declare @TableName nvarchar(100)
Declare @SQL nvarchar(1000)

declare tables_cursor CURSOR FOR
            select [name] from sysobjects 
            where xtype = 'U' 
            and [name] not like 'sys%' 
            order by [name]
Open tables_cursor

fetch next from tables_cursor into @TableName
WHILE @@FETCH_STATUS = 0
Begin

--create trigger for insert on each table
            print @SQL
            set @SQL = 'create trigger trg_u_'+@TableName+'_Inserted '
            set @SQL = @SQL + ' on '+@TableName
            set @SQL = @SQL + ' for insert '
            set @SQL = @SQL + ' as '
            set @SQL = @SQL + ' begin '
            set @SQL = @SQL + '    insert into [dbo].[RawDataStorage_Audit] '
            set @SQL = @SQL + ' select ''' + @TableName +''', getdate()'
            set @SQL = @SQL + ' from inserted'
            set @SQL = @SQL + ' end'
            exec (@SQL)
            print @SQL

            fetch next from tables_cursor into @TableName
end

CLOSE tables_cursor
DEALLOCATE tables_cursor