他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作

供给背景

  

   
下一周遇到了这么一个必要,维护职员开掘二个表的数目平常被修正,由于历史由来;文书档案缺乏;以至维护人士的常常退换,导致她们对系统也业务也不完全熟谙,他们也不完全知道如何系统和应用程序会对这么些表的数据开展操作。今后她俩想搜索有哪些服务器,哪些应用程序会对这么些表进行INSERT、UPDATE操作。那么难题来了,怎么去消亡这几个难题吧?

 

缓慢解决方案

出于数据库版本是典型版,大家采用了运用触发器来捕获实行DML操作的对话的相关音信,例如,Host_Name、Program_Name等
,选取触发器是因为轻巧直接。大家先创制多少个表名叫TEST的表,如果大家想监察和控制有如何应用服务器,甚至那个应用程序会对表TEST进行INSERT、UPDATE操作。

USE [AdventureWorks2014]

GO

 

 

IF NOT EXISTS (SELECT 1 FROM sys.sysobjects WHERE id=object_id(N'[dbo].[TEST]') AND OBJECTPROPERTY(id, N'IsTable')=1 )

BEGIN

CREATE TABLE [dbo].[TEST](

    [OBJECT_ID] [INT] NOT NULL,

    [NAME] [VARCHAR](8) NULL,

    CONSTRAINT PK_TEST    PRIMARY KEY (OBJECT_ID)

) 

END

GO

 

INSERT INTO dbo.TEST

SELECT 1, 'kerry' UNION ALL

SELECT 2, 'jimmy'

 

那正是说大家接下去在表上边新扩张多少个字段
[HOST_他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作。NAME]、[PROGRAM_NAME]、LOGIN_他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作。NAME用来记录最终一遍改进该记录的对话音讯,其它成立触发器T奥德赛G_他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作。TEST来更新这么些字段

ALTER TABLE TEST ADD  [HOST_NAME]  NVARCHAR(256)

ALTER TABLE TEST ADD  [PROGRAM_NAME] NVARCHAR(256);

ALTER TABLE TEST ADD  LOGIN_NAME  NVARCHAR(256);

 

CREATE TRIGGER TRG_TEST ON dbo.TEST AFTER 

INSERT,UPDATE

AS 

 

IF (EXISTS(SELECT  1 FROM  INSERTED))

BEGIN

 

    UPDATE  dbo.TEST

    SET     dbo.TEST.[HOST_NAME] = ( SELECT host_name

                                     FROM   sys.dm_exec_sessions

                                     WHERE  session_id = @@SPID

                                   ) ,

            dbo.TEST.PROGRAM_NAME = ( SELECT    program_name

                                      FROM      sys.dm_exec_sessions

                                      WHERE     session_id = @@SPID

                                    ) ,

            dbo.TEST.LOGIN_NAME = ( SELECT  login_name

                                    FROM    sys.dm_exec_sessions

                                    WHERE   session_id = @@SPID

                                  )

    FROM    dbo.TEST t

            INNER JOIN INSERTED i ON t.OBJECT_ID = i.OBJECT_ID

END

GO

 

接下去,我们来回顾测验一下,如下所示,布满插入、更新一条记下

INSERT INTO dbo.TEST(OBJECT_ID,NAME)

SELECT 3,'ken'

 

UPDATE dbo.TEST SET NAME='Richard' WHERE  OBJECT_ID=2;

 

正如所示,因为作者只是用SSMS更新,插入数据,所以捕获的是Microsoft SQL
Server Management Studio – Query。

图片 1

 

那这种措施还应该有三个弊病,那正是假使应用程序的SQL,写得非常不足完善的话,那么扩展字段就能够促成原先的应用程序现身难题,比如,应用程序有上边这样的SQL,扩大字段后,它就能报错。

INSERT INTO dbo.TEST

SELECT 3,'ken'

 

据此这种方案不太实用,会追加应用程序现身Bug的危害。那么实际上大家得以新建一个表,每当原表TEST有INSERT、UPDATE操作时,通过触发器捕获会话进度消息,然后插入该表(注意,新建的表包涵源表的主键字段,举例这里TEST的主键字段为OBJECT_ID,那么我们下边就包罗OBJECT_ID)

USE [AdventureWorks2014]

GO

 

DROP TABLE  dbo.[TRG_TEST_SESSION_INFO];

GO

 

IF NOT EXISTS (SELECT 1 FROM sys.sysobjects WHERE id=object_id(N'[dbo].[TRG_TEST_SESSION_INFO]') AND OBJECTPROPERTY(id, N'IsTable')=1 )

BEGIN

CREATE TABLE [TRG_TEST_SESSION_INFO](

    [ID]               INT NOT NULL IDENTITY(1,1),

    [OBJECT_ID]        INT,

    [HOST_NAME]        NVARCHAR(256),

    [PROGRAM_NAME]     NVARCHAR(256),

    [LOGIN_NAME]       NVARCHAR(256),

    CONSTRAINT PK_TRG_TEST_SESSION_INFO    PRIMARY KEY (ID)

) 

END

GO

 

CREATE TRIGGER TRG_TEST_SESSION ON dbo.TEST

AFTER INSERT ,UPDATE

AS

 

IF (EXISTS(SELECT  1 FROM  INSERTED))

BEGIN

 

    /*

    INSERT INTO dbo.[TRG_TEST_SESSION_INFO]

    SELECT  (SELECT I.OBJECT_ID FROM INSERTED I), HOST_NAME,program_name,login_name

                                     FROM   sys.dm_exec_sessions

                                     WHERE  session_id = @@SPID*/

    INSERT INTO dbo.[TRG_TEST_SESSION_INFO]

    SELECT  I.OBJECT_ID, S.HOST_NAME,S.PROGRAM_NAME,S.LOGIN_NAME

                                     FROM   sys.dm_exec_sessions s,

                                            Inserted i

                                     WHERE  session_id = @@SPID

 

  

END

GO

 

在运营一小段日子后,若是已经寻找了如何服务器、哪些应用程序会对那个表操作后,那么就务须立即删除那个表和触发器,防止长日子运作,影响属性。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图