【发布时间】:2010-09-24 16:22:01
【问题描述】:
我从事的项目有以下要求:
TableA 是父表。每当更新 TableA 的任何子记录时,TableA 中的“LastActivityDate”字段都应更新为当前的 UTC 日期。
现在,我知道有很多方法可以做到这一点。我的帖子不是关于这可以实现的许多不同方式。
我最初建议对这个要求使用触发器,但我们的 DBA 拒绝了我,因为他们不希望在这个 DB 中使用触发器(我不知道为什么,这对我的问题并不重要)。我最终创建了一个存储过程,其唯一目的是更新 TableA.LastActivityDate。然后我编写了 TableA 子项的更新/插入存储过程来调用这个存储过程。因此,例如,一个孩子的更新存储过程如下所示:
Create Procedure TableB_UPD
(
@TableBId INT
@TableBName VARCHAR(30)
)
AS
BEGIN
UPDATE dbo.TableB
SET TableBName = @TableBName
WHERE
(TableBId = @TableBId)
DECLARE @TableAId INT
SELECT
@TableAId = TableAId
FROM
dbo.TableB
WHERE
(TableBId = @TableBId)
EXEC dbo.TableA_LastActivityDate_UPD @TableAId
END
这是非常直接的代码,我从 TableB_UPD 存储过程中调用 dbo.TableA_LastActivityDate_UPD 存储过程。当我们的 DBA 看到这一点时,他们拒绝在他们的数据库中允许它。他们告诉我,在存储过程中调用存储过程会对性能造成巨大影响。我一直找不到任何好的在线文章来支持这种说法(DBA 也无法给我任何东西)。
我在很多数据库中都看到过这种代码,直到现在还没有听说过任何性能问题。我的问题是:有人可以解释这种代码的性能问题吗?我也非常感谢您对文章的引用。
这是在 SQL Server 2005 中。
【问题讨论】:
-
恕我直言,我认为您的 DBA 充满了@#$%。 :-)
-
不允许触发器的 DBA 对性能和执行计划如何实现这一点了解不够,这并不奇怪。
-
我要指出,无论记录如何更改,触发器都是可以强制执行此要求的唯一可靠方式。一个不明白这一点的 dba 是我不会让我靠近我的数据库的人。要求不是无论何时 GUI 更改数据,而是无论何时更改数据。我会把这个告诉你的老板,让他和 dbas 老板讨论 dba 的无能。
-
寻找问题解决方案的最佳地点:careers.stackoverflow.com
-
@gerald,但这就是重点,您不能保证 .net 代码是影响数据的唯一途径。
标签: sql sql-server sql-server-2005 stored-procedures