Sql server 2005 查看数据库列以确定正在修改的内容

Sql server 2005 查看数据库列以确定正在修改的内容,sql-server-2005,Sql Server 2005,如何找出哪个应用程序或SP正在修改配置表中的值?我以为我已经隔离了负责的应用程序,但当我不断修改它们为false时,这些特定值会不断变回true 首先,创建一个日志记录表: CREATE TABLE modlog( datestamp smalldatetime, username varchar(255) NOT NULL DEFAULT SYSTEM_USER ); 然后在表上创建更新触发器: CREATE TRIGGER mytable_mods ON mytable

如何找出哪个应用程序或SP正在修改配置表中的值?我以为我已经隔离了负责的应用程序,但当我不断修改它们为false时,这些特定值会不断变回true

首先,创建一个日志记录表:

CREATE TABLE modlog(
   datestamp smalldatetime,
   username varchar(255) NOT NULL DEFAULT SYSTEM_USER
   );
然后在表上创建更新触发器:

CREATE TRIGGER mytable_mods ON mytable FOR UPDATE AS
   INSERT INTO modlog(smalldatetime) VALUES (GETDATE());
只需查看modlog表就可以知道哪个用户正在更新该表,以及何时更新。你可以想象一下,还可以记录正在更新的特定字段

另一种方法是在SQLServerProfiler中设置一个跟踪,过滤掉它,使它只返回该表上的更新,并保持它打开,直到发生什么事情


如果应用程序在其连接字符串中包含ApplicationName参数,则可以使用App\u Name()而不是SYSTEM\u USER,这将记录应用程序名称,从而消除额外的检测工作。了解用户可能仍然有用,这样您就可以知道他们在做什么来触发更新。

首先,创建一个日志记录表:

CREATE TABLE modlog(
   datestamp smalldatetime,
   username varchar(255) NOT NULL DEFAULT SYSTEM_USER
   );
然后在表上创建更新触发器:

CREATE TRIGGER mytable_mods ON mytable FOR UPDATE AS
   INSERT INTO modlog(smalldatetime) VALUES (GETDATE());
只需查看modlog表就可以知道哪个用户正在更新该表,以及何时更新。你可以想象一下,还可以记录正在更新的特定字段

另一种方法是在SQLServerProfiler中设置一个跟踪,过滤掉它,使它只返回该表上的更新,并保持它打开,直到发生什么事情

如果应用程序在其连接字符串中包含ApplicationName参数,则可以使用App\u Name()而不是SYSTEM\u USER,这将记录应用程序名称,从而消除额外的检测工作。了解用户可能仍然有用,这样您就可以知道他们在做什么来触发更新。

创建一个触发器以回滚更新。等待应用程序出错。它可以是一个非常简单的触发器:

CREATE TRIGGER BugOffRogueProgram
ON MyConfigTable
FOR UPDATE
AS
BEGIN
ROLLBACK TRAN
END

创建一个触发器以回滚更新。等待应用程序出错。它可以是一个非常简单的触发器:

CREATE TRIGGER BugOffRogueProgram
ON MyConfigTable
FOR UPDATE
AS
BEGIN
ROLLBACK TRAN
END

到目前为止,我们提供的答案完全是即时的-这是SQL Server 2005中的做法

作为一个简单的提示:在SQLServer2008中,有一个新的特性被称为“开箱即用”,以支持这个确切的场景,而无需自己编写触发器和更新表。非常方便


Marc

到目前为止,提供的答案完全在现场-这是SQL Server 2005中的做法

作为一个简单的提示:在SQLServer2008中,有一个新的特性被称为“开箱即用”,以支持这个确切的场景,而无需自己编写触发器和更新表。非常方便


Marc

这会识别用户名吗?@richard,如果您可以将用户名与特定应用程序关联,这应该会起作用。是的,这会识别与执行更新的SQL Server会话关联的用户名。希望了解用户和时间足以确定哪个应用程序负责。当然,如果您的所有用户都通过ASP.NET应用程序,然后使用该应用程序的一个默认用户连接到您的数据库,那么每个人都被称为“应用程序用户”:-(@marc_s OP最理想的做法是查找导致问题的应用程序,因此只要他在每个应用程序的连接字符串中使用ApplicationName参数,就应该可以确定troble maker。将用户记录下来是一种解决方法,以防他无法使用ApplicationName。在某些情况下(通常是WinForms或紧密集成的intranet应用程序),“用户”将是Windows用户。但对于ASP.NET应用程序,他的应用程序可能都有自己的SQL Server登录名,而不是全部使用一个登录名进行模拟,因此可能仍然可以使用。这可以识别用户名吗?@richard,如果你能将用户名与特定应用程序关联,这应该可以工作。是的,这将识别fy与正在执行更新的SQL Server会话关联的用户名。希望知道用户和时间足以确定是哪个应用程序负责。当然,如果您的所有用户都通过ASP.NET应用程序连接到您的数据库,然后使用该应用程序的单个默认用户,则所有人都将被调用ed“application user”:-(@marc_s OP最理想的做法是查找导致问题的应用程序,因此只要他在每个应用程序的连接字符串中使用ApplicationName参数,就应该可以确定troble maker。记录用户是一种解决方法,以防他无法使用ApplicationName。在某些情况下(通常是WinForms或紧密集成的intranet应用程序),“用户”将是字面意义上的Windows用户。但对于ASP.NET应用程序,他的应用程序可能每个都有自己的SQL Server登录名,而不是全部使用一个登录名,因此可能仍然可以。