SQL - Source Control and Schema/Script management

前端 未结 10 2089
野的像风
野的像风 2021-01-05 10:27

My company has just gone though its annual review process, and I have finally convinced them that it is time to find a better solution to manage our SQL schema/scripts. Cur

10条回答
  •  长发绾君心
    2021-01-05 10:56

    Here is my script to track stored proc and udf and triggers into a table.

    1. Create a table to hold existing stored proc source code

    2. INsert the table with all existing trigger and script data

    3. Create a DDL trigger to monitor changes on them

              /****** Object:  Table [dbo].[sysupdatelog]    Script Date: 9/17/2014 11:36:54 AM ******/
              SET ANSI_NULLS ON
              GO
      
              SET QUOTED_IDENTIFIER ON
              GO
      
                              CREATE TABLE [dbo].[sysupdatelog] (
                                  [id] [bigint] IDENTITY(1, 1) NOT NULL
                                  ,[UpdateUsername] [nvarchar](1000) NULL
                                  ,[actionname] [nvarchar](1000) NULL
                                  ,[objectname] [nvarchar](1000) NULL
                                  ,[type] [nvarchar](1000) NULL
                                  ,[createDate] [datetime] NULL
                                  ,[content] NTEXT NULL
                                  ,CONSTRAINT [PK_sysupdatelog] PRIMARY KEY CLUSTERED ([id] ASC) WITH (
                                      PAD_INDEX = OFF
                                      ,STATISTICS_NORECOMPUTE = OFF
                                      ,IGNORE_DUP_KEY = OFF
                                      ,ALLOW_ROW_LOCKS = ON
                                      ,ALLOW_PAGE_LOCKS = ON
                                      ) ON [PRIMARY]
                                  ) ON [PRIMARY]
                              GO
      
              ALTER TABLE [dbo].[sysupdatelog] ADD CONSTRAINT [DF__sysupdate__conte__4EDE7CE6] DEFAULT('')
              FOR [content]
              GO
      
              INSERT INTO [dbo].[sysupdatelog] (
                  [UpdateUsername]
                  ,[actionname]
                  ,[objectname]
                  ,[type]
                  ,[createDate]
                  ,[content]
                  )
              SELECT 'sa'
                  ,'loginitialdata'
                  ,r.ROUTINE_NAME
                  ,r.ROUTINE_TYPE
                  ,GETDATE()
                  ,r.ROUTINE_DEFINITION
              FROM INFORMATION_SCHEMA.ROUTINES r
      
              UNION
      
              SELECT 'sa'
                  ,'loginitialdata'
                  ,v.TABLE_NAME
                  ,'view'
                  ,GETDATE()
                  ,v.VIEW_DEFINITION
              FROM INFORMATION_SCHEMA.VIEWS v
      
              UNION
      
              SELECT 'sa'
                  ,'loginitialdata'
                  ,o.NAME
                  ,'trigger'
                  ,GETDATE()
                  ,m.DEFINITION
              FROM sys.objects o
              JOIN sys.sql_modules m ON o.object_id = m.object_id
              WHERE o.type = 'TR'
              GO
      
              CREATE TRIGGER [SCHEMA_AUDIT] ON DATABASE
              FOR CREATE_PROCEDURE
                  ,ALTER_PROCEDURE
                  ,DROP_PROCEDURE
                  ,CREATE_INDEX
                  ,ALTER_INDEX
                  ,DROP_INDEX
                  ,CREATE_TRIGGER
                  ,ALTER_TRIGGER
                  ,DROP_TRIGGER
                  ,ALTER_TABLE
                  ,ALTER_VIEW
                  ,CREATE_VIEW
                  ,DROP_VIEW AS
      
              BEGIN
                  SET NOCOUNT ON
      
                  DECLARE @data XML
      
                  SET @data = Eventdata()
      
                  INSERT INTO sysupdatelog
                  VALUES (
                      @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(255)')
                      ,@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(255)')
                      ,@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(255)')
                      ,@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(255)')
                      ,getdate()
                      ,@data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')
                      )
      
                  SET NOCOUNT OFF
              END
              GO
      
              SET ANSI_NULLS OFF
              GO
      
              SET QUOTED_IDENTIFIER OFF
              GO
      
              ENABLE TRIGGER [SCHEMA_AUDIT] ON DATABASE
              GO
      

提交回复
热议问题