Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server架构审核?_Sql_Database_Sql Server 2008_Database Administration_Ddl Trigger - Fatal编程技术网

SQL server架构审核?

SQL server架构审核?,sql,database,sql-server-2008,database-administration,ddl-trigger,Sql,Database,Sql Server 2008,Database Administration,Ddl Trigger,我们有一个SQL Server 2008企业数据库,它有两个不同的模式,一个是我们维护的锁定模式,另一个是开放模式,我们允许外部开发团队根据自己的需要添加和修改。通常这对我们来说没问题,但有一支球队喜欢把事情搞砸,这会影响到其他人。因此,有两个问题: 事后看来,我希望我们从一开始就设置了一些健壮的东西,但我们没有,只是默认安装。如果能够看到到目前为止对模式所做的工作,那将是一件好事,即使它像“2012年12月7日上午9:00,用户XYZ更改了ABC过程”这样简单。SQL Server中是否有内置

我们有一个SQL Server 2008企业数据库,它有两个不同的模式,一个是我们维护的锁定模式,另一个是开放模式,我们允许外部开发团队根据自己的需要添加和修改。通常这对我们来说没问题,但有一支球队喜欢把事情搞砸,这会影响到其他人。因此,有两个问题:

  • 事后看来,我希望我们从一开始就设置了一些健壮的东西,但我们没有,只是默认安装。如果能够看到到目前为止对模式所做的工作,那将是一件好事,即使它像“2012年12月7日上午9:00,用户XYZ更改了ABC过程”这样简单。SQL Server中是否有内置的、默认情况下启用的跟踪这些信息的工具,我们可以利用它们,如果有,在哪里/如何利用它们
  • 就长期解决方案而言,您对此有何建议?我一直在读DDL触发器,这似乎是一个很有希望的选择。如果你使用过这种方法,你能分享一下它是如何工作的,以及你可以用它做些什么吗

  • 谢谢

    您可以考虑将数据库置于源代码管理之下。也许让每一个外部团队都拥有数据库的一个分支或分支。这使您能够通过提交审核更改,并能够选择合并哪些更改和/或在合并之前查看/编辑这些更改

    查看一个可用的产品


    与Github或Bitbucket这样的解决方案相结合,可以通过internet更直接地向外部贡献者开放源代码管理存储库。

    我有一个系统,它使用DDL触发器来完成这类工作。它能很好地满足我的需要。它最初是在SQLServer2005上开发的,现在使用SQLServer2008R2系统。这与艾伦·伯特兰评论中的链接所描述的相似

    创建一个类似于此的表

    CREATE TABLE [dbo].[SchemaLog](
        [SchemaLogID] [int] IDENTITY(1,1) NOT NULL,
        [PostTimeUtc] [datetime] NOT NULL,
        [DatabaseUser] [nvarchar](128) NOT NULL,
        [Event] [nvarchar](128) NOT NULL,
        [Schema] [nvarchar](128) NULL,
        [Object] [nvarchar](128) NULL,
        [TSQL] [nvarchar](max) NOT NULL,
        [XmlEvent] [xml] NOT NULL,
     CONSTRAINT [PK_SchemaLog_1] PRIMARY KEY CLUSTERED 
    (
        [SchemaLogID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    确保每个人都对表具有插入权限,然后创建一个类似于此的ddl触发器

    CREATE TRIGGER [ddlDatabaseTriggerLog] ON DATABASE  FOR DDL_DATABASE_LEVEL_EVENTS AS  
    BEGIN     
        SET NOCOUNT ON;     
        DECLARE @data XML;     
        DECLARE @schema sysname;     
        DECLARE @object sysname;     
        DECLARE @eventType sysname;     
        SET @data = EVENTDATA();     
        SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');     
        SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');     
        SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')      
        IF @object IS NOT NULL         
            PRINT '  ' + @eventType + ' - ' + @schema + '.' + @object;     
        ELSE         
            PRINT '  ' + @eventType + ' - ' + @schema;     
    
        IF @eventType IS NULL         
            PRINT CONVERT(nvarchar(max), @data);     
    
        INSERT [dbo].[SchemaLog]          (         
            [PostTimeUtc]
        ,          [DatabaseUser]
        ,          [Event]
        ,          [Schema]
        ,          [Object]
        ,          [TSQL]
        ,          [XmlEvent]         )      
        VALUES          (         
            GETUTCDATE()
        ,          CONVERT(sysname, CURRENT_USER)
        ,          @eventType
        ,          CONVERT(sysname, @schema)
        ,          CONVERT(sysname, @object)
        ,          @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
        ,          @data         ); 
    
    END;
    
    查看以按顺序选择更改

    create view SchemaLogOrdered
    as
    SELECT top 10000 *
    FROM            dbo.SchemaLog
    ORDER BY  SchemaLogID DESC
    

    对于第二个问题,你可以考虑触发器作为一个选项。在以下示例中,有关触发触发器的事件的信息是使用SQL Server的EVENTDATA()函数捕获的。SQL脚本创建DDL触发器,用于在数据库级别捕获创建、更改和删除事件(尽管可以在服务器级别创建触发器以捕获服务器上所有数据库的事件;应使用“在所有服务器上”选项,而不是在数据库上)

    还必须为EVENTDATA XML中的审核数据创建适当的存储表:

    CREATE TABLE Audit_DDL_Events( DDL_Event_Time datetime , 
                               DDL_Login_Name varchar( 150
                                                     ) , 
                               DDL_User_Name varchar( 150
                                                    ) , 
                               DDL_Database_Name varchar( 150
                                                        ) , 
                               DDL_Schema_Name varchar( 150
                                                      ) , 
                               DDL_Object_Name varchar( 150
                                                      ) , 
                               DDL_Object_Type varchar( 150
                                                      ) , 
                               DDL_Command varchar( max
                                                  )
                             );
    

    Redgate选项如下所示

    1) 开始审核架构更改的最简单方法是安装。这是一个免费的工具,可以使用DDL触发器提醒和记录所有更改,并将包括您要求的信息


    2) 正如Andy Davies已经提到的,正确的方法是以与应用程序代码相同的方式开始对模式进行源代码控制。完成此操作后,您可以通过将数据库纳入持续集成和发布管理实践来提高您的成熟度。

    For 2。有没有办法用这个来获取计算机名或主机名?我希望从一个通用SQL登录中得到更新,这样我们就无法锁定真正的来源。我还猜测这是不可能的,因为它并没有和XML数据一起发送。
    CREATE TABLE Audit_DDL_Events( DDL_Event_Time datetime , 
                               DDL_Login_Name varchar( 150
                                                     ) , 
                               DDL_User_Name varchar( 150
                                                    ) , 
                               DDL_Database_Name varchar( 150
                                                        ) , 
                               DDL_Schema_Name varchar( 150
                                                      ) , 
                               DDL_Object_Name varchar( 150
                                                      ) , 
                               DDL_Object_Type varchar( 150
                                                      ) , 
                               DDL_Command varchar( max
                                                  )
                             );