是否可以使用sp_MSforeachtable过程在数据库中的所有表上创建触发器

时间:2013-04-12 08:57:32

标签: sql-server-2008 triggers

我试图创建一个循环遍历数据库中所有表的函数,并创建一个触发器(如果它不存在)。经过一些研究我遇到了存储过程:“sp_MSforeachtable procedure”有人可以帮我一个将使用该函数在下面创建触发器的代码。触发器工作正常,现在我需要确保它使用loop.NB我应该在所有表上应用。我不想在所有表上手动运行它。性能明智我知道在数据库中的所有表上都有触发器可能不是最好的主意。这是我的触发器

USE [Issue]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[Update_DateCreated_DateModified]
ON  [dbo].[Patient] 
FOR  INSERT
AS 
BEGIN
DECLARE @getDateCreated Datetime = GETDATE()
DECLARE @getDateModified DATETIME=GETDATE()
DECLARE @patient_nin VARCHAR(50) = (SELECT NIN FROM INSERTED i)
SET NOCOUNT ON;
UPDATE dbo.Patient SET DateCreated=@getDateCreated,DateModified=@getDateModified
END   
GO

1 个答案:

答案 0 :(得分:1)

以下代码未经过测试,但它应该是这样的。

EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''?_Update_DateCreated_DateModified''))
EXEC dbo.sp_executesql @statement = 
N''CREATE TRIGGER [dbo].[?_Update_DateCreated_DateModified]
ON  ?
FOR  INSERT
AS 
BEGIN
DECLARE @getDateCreated Datetime = GETDATE()
DECLARE @getDateModified DATETIME=GETDATE()
DECLARE @patient_nin VARCHAR(50) = (SELECT NIN FROM INSERTED i)
SET NOCOUNT ON;
UPDATE ? SET DateCreated=@getDateCreated,DateModified=@getDateModified
END   
;'''

?被表名替换。如果我没记错的话