1

我们有一个大型数据库(许多表、SP、函数和...),我们的数据库程序员超过 10 人。所有主题都可以使用我们的主服务器计算机或他的本地系统上的数据库。

我们的要求:

我们希望每个数据库程序员都可以通过 SQL SERVER MANAGMENT STUDIO(或您的建议工具)应用他的定义(创建表、触发器、sp、fn 和...)和修改(在表、sp、触发器、fn 和...上)并在每天结束时将所有这些活动作为 TSQL 脚本。

因此,我们希望将数据库程序员活动的自动日志记录为 TSQL 脚本(子 tsql 查询的序列)。例如:

我的活动:

我的第一个活动>> 我以设计模式打开我的客户表,右键单击表并单击设计。然后我将 ID 字段的数据类型从 INT 更改为 BigInt。然后保存

我的第二个活动>> 我更改了 PR_Customer_Insert 存储过程并执行它。

现在我想要一个像这样的可执行日志:

-- UserName: Ram
-- 2013-02-10 10:20:35
Alter Table ALTER TABLE Customer ALTER COLUMN Id TYPE bigint;
Go


-- UserName: Ram
-- 2013-02-10 10:45:00
Drop Sp DROP PROCEDURE dbo.PR_Customer_Insert;


-- UserName: Ram
-- 2013-02-10 10:45:00
Create sp CREATE PROCEDURE PR_Customer_Insert
@id int,
@name nvarchar(30) AS
       
 INSERT INTO Customer
 (
    @id,
    @name
 )
       
GO

我们知道比较两个数据库是一种解决方案,但我们希望访问 SSMS 查询管道......

我的问题:

这个请求有什么办法(自动生成的日志是一个可执行的 TSQL 脚本)?自动生成此脚本的最佳解决方案是什么???您如何看待数据库团队合作中的这个想法?

谢谢...

4

2 回答 2

2

可能使用DDL 触发器,但在某个数据库上

简单的例子:

--Create table EvtLog     
CREATE TABLE EvtLog 
 (
  LoginName NVARCHAR(100),
  PostTime DATETIME,  
  EventType NVARCHAR(100),
  TSQLCommand NVARCHAR(2000)  
  )
GO
--Create the DDL trigger 
CREATE TRIGGER trPreventTblChange 
ON DATABASE
FOR DROP_TABLE, CREATE_TABLE, ALTER_TABLE, 
    DROP_PROCEDURE, CREATE_PROCEDURE, ALTER_PROCEDURE
AS
DECLARE @Data XML
SET @Data = EventData()
INSERT EvtLog (LoginName, PostTime, EventType, TSQLCommand)
SELECT @Data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
       @Data.value('(/EVENT_INSTANCE/PostTime)[1]', 'nvarchar(100)'),       
       @Data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
       @Data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)');
GO
于 2013-02-05T11:42:04.570 回答
1

设置数据库DDL 触发器使用 EVENTDATA 函数查找有关已完成操作的更多信息,并将其插入到您可以在一天结束时查询的表中

例子

CREATE TRIGGER [LogDDL] ON DATABASE 
    FOR DDL_DATABASE_LEVEL_EVENTS 
AS 
DECLARE @xml XML;
SELECT @xml = EVENTDATA(); 

INSERT ChangeLog 
( 
    ObjectName, 
    SQL 
)  
VALUES
( 
    @xml.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'), 
    @xml.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)') 
);  
于 2013-02-05T11:40:58.223 回答