我正在使用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"。
任何帮助都会得到很大的帮助
答案 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