1

大規模なデータベース (多くのテーブル、SP、関数など) があり、データベース プログラマーは 10 人を超えています。すべてのテーマは、メイン サーバー コンピューターまたはローカル システムのデータベースを使用できます。

私たちの要件:

各データベース プログラマーが、SQL SERVER MANAGMENT STUDIO (または提案ツール) によって、定義 (テーブル、トリガー、sp、fn &... の作成) と変更 (テーブル、sp、トリガー、fn &...) を適用できることを望んでいます。そして、毎日の終わりに、このすべてのアクティビティを TSQL スクリプトとして取得します。

そのため、db プログラマーのアクティビティの自動ログを TSQL スクリプト (サブ tsql クエリのシーケンス) として取得する必要があります。例えば:

私の活動:

私の最初のアクティビティ>> Customer テーブルをデザイン モードで開きます。テーブルを右クリックし、[デザイン] をクリックします。次に、ID フィールドのデータ型を INT から BigInt に変更します。次に保存します

2 番目のアクティビティ>> 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

Compare tow データベースがソリューションであることはわかっていますが、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関数を使用して、何が行われたかについての詳細を調べ、それを1日の終わりに照会できるテーブルに挿入します。

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 に答える