Sql server 2005 多表触发器SQL Server noob
我有一大堆表,它们都有相同的2个datetime列(lastModDate、DateAdd)。 我想知道是否可以为这些表设置全局插入更新触发器来设置日期时间值。如果没有,有什么办法Sql server 2005 多表触发器SQL Server noob,sql-server-2005,Sql Server 2005,我有一大堆表,它们都有相同的2个datetime列(lastModDate、DateAdd)。 我想知道是否可以为这些表设置全局插入更新触发器来设置日期时间值。如果没有,有什么办法 非常受欢迎的任何指针不,没有“全局”触发器或多表触发器。触发器是按设计绑定到表的,因此如果需要在一堆表上使用触发器,则需要创建一堆触发器,每个表一个,然后部署它们。恐怕没有办法解决这个问题。您可以为插入(DateAdd)使用默认值,为更新使用表触发器 差不多 CREATE TABLE MyTable (
非常受欢迎的任何指针不,没有“全局”触发器或多表触发器。触发器是按设计绑定到表的,因此如果需要在一堆表上使用触发器,则需要创建一堆触发器,每个表一个,然后部署它们。恐怕没有办法解决这个问题。您可以为插入(DateAdd)使用默认值,为更新使用表触发器 差不多
CREATE TABLE MyTable (
ID INT,
Val VARCHAR(10),
lastModDate DATETIME DEFAULT CURRENT_TIMESTAMP,
dateAdded DATETIME DEFAULT CURRENT_TIMESTAMP
)
GO
CREATE TRIGGER MyTableUpdate ON MyTable
FOR UPDATE
AS
UPDATE MyTable
SET lastModDate = CURRENT_TIMESTAMP
FROM MyTable mt INNER JOIN
inserted i ON mt.ID = i.ID
GO
INSERT INTO MyTable (ID, Val) SELECT 1, 'A'
GO
SELECT *
FROM MyTable
GO
UPDATE MyTable
SET Val = 'B'
WHERE ID = 1
GO
SELECT *
FROM MyTable
GO
DROP TABLE MyTable
GO
我同意没有这样的全局触发器,但我们当然可以通过创建脚本来减少我们的工作量,该脚本将为表生成触发器 类似于:为所有表生成触发器 我这样做最初是为了为数据库中的所有表生成触发器以审核数据更改,这非常简单,只需将整个行从已删除表移动到镜像审核表 但是有人想跟踪桌子上的活动,所以它稍微简单一点。在这里,我们创建一个日志表,每当dml操作发生时,它都被写入其中 享受
由于代码将是相同的,并且只有表名称将被更改。。。
我认为最好的方法是创建一个程序,然后从每个触发器调用这个程序谢谢,这种想法只是希望而已。我可以在这里使用一些常规的配置。谢谢,这就是我的想法。我仍然需要每个表都有一个更新触发器,对吗?这很有趣。谢谢
USE Northwind GO
CREATE TABLE LOG_TABLE (Add_dttm datetime DEFAULT (GetDate()),
TABLE_NAME sysname, Activity char(6)) GO
DECLARE @sql varchar(8000), @TABLE_NAME sysname SET NOCOUNT ON
SELECT @TABLE_NAME = MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.Tables
WHILE @TABLE_NAME IS NOT NULL BEGIN SELECT @sql = 'CREATE TRIGGER
[' + @TABLE_NAME + '_Usage_TR] ON [' + @TABLE_NAME +'] ' + 'FOR
INSERT, UPDATE, DELETE AS ' + 'IF EXISTS (SELECT * FROM inserted)
AND NOT EXISTS (SELECT * FROM deleted) ' + 'INSERT INTO LOG_TABLE
(TABLE_NAME,Activity) SELECT ''' + @TABLE_NAME + ''', ''INSERT''' + '
' + 'IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM
deleted) ' + 'INSERT INTO LOG_TABLE (TABLE_NAME,Activity) SELECT '''
+ @TABLE_NAME + ''', ''UPDATE''' + ' ' + 'IF NOT EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted) ' + 'INSERT INTO
LOG_TABLE (TABLE_NAME,Activity) SELECT ''' + @TABLE_NAME + ''',
''DELETE''' + ' GO' SELECT @sql EXEC(@sql) SELECT @TABLE_NAME =
MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.Tables WHERE TABLE_NAME >
@TABLE_NAME END SET NOCOUNT OFF