我正在尝试在SQL Server 2008 R2中创建一个触发器以用于审计目的。为了获得全国不同位置的正确时区,我试图将变量传递给IF / ELSE IF语句,以使用DATEADD()函数更改小时数。这是我的代码:
CREATE TRIGGER epic_cover_insert
ON epic_cover
AFTER INSERT
AS
BEGIN
DECLARE @facilityCode INT
SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover)
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
UPDATE epic_cover
IF @facilityCode = 403 --for logan
BEGIN
SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME()
WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
ELSE Created_By END,
Created_On = DATEADD(HH,-1,GETDATE()
END
ELSE IF @facilityCode = 203 -- for Thermont
BEGIN
SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME()
WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
ELSE Created_By END,
Created_On = DATEADD(HH,1,GETDATE())
END
ELSE IF @facilityCode = 263 --for Saint Charles
BEGIN
SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME()
WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
ELSE Created_By END,
Created_On = GETDATE()
END
END
END
我得到了各种各样的错误,所有这些错误都说明了对话。我不确定这意味着什么。我用谷歌搜索它,这只是增加了混乱。
答案 0 :(得分:0)
首先,在编写触发器时,您必须考虑一次插入,更新或删除多条记录!
我假设sql server正在查看你的代码,但是如果有不同的rdbms请注意它。
下一步
SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover)
总是会给你epic_cover中已经不是你想要的设施代码。
然后,您尝试将IF语句与不允许的更新语句混合使用。但实际情况是你没有任何if,你只能使用案例陈述。
然后,您将更新表中的所有记录,而不仅仅是已插入的记录。如果你没有一个或一个方法来确定添加了哪些记录,你将需要一个主键!然后使用特殊的"inserted"
表。
CREATE TRIGGER epic_cover_insert
ON epic_cover
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
UPDATE epic_cover
SET Created_By = CASE WHEN i.Created_By IS NULL THEN SUSER_NAME()
WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
ELSE i.Created_By END
,Created_On = CASE
-- right function is for strings so I assume order num is a string if not you will need to do some casting
WHEN RIGHT(i.order_num, 3) = '403' THEN DATEADD(HH,-1,GETDATE())
WHEN RIGHT(i.order_num, 3) = '203' THEN DATEADD(HH,1,GETDATE())
WHEN RIGHT(i.order_num, 3) = '263' THEN GETDATE()
ELSE NULL-- ?????
END
FROM
epic_cover e
INNER JOIN inserted i
ON e.PrimaryKey = i.PrimaryKey
END