代码之家  ›  专栏  ›  技术社区  ›  Jeremiah Peschka

镜像表修改

  •  0
  • Jeremiah Peschka  · 技术社区  · 16 年前

    我有一套用来跟踪账单的桌子。这些表是从每周运行的SSIS进程加载的。

    我正在创建第二组表来跟踪通过Web对账单进行的调整。我们的一些客户交钥匙他们的帐单和所有这些条目需要备份在一个更定期的时间表(SSIS FED数据总是可以再次导入,所以它没有备份)。

    这种行为是否有最佳实践?我正在考虑实现一个DDL触发器,该触发器将解析alter table调用并更改正在调用的表。这有点痛苦,我很好奇有没有更好的方法。

    2 回复  |  直到 16 年前
        1
  •  1
  •   HLGEM    16 年前

    我个人希望在一个数据库(设置为简单恢复模式)中使用ssis-fed表,而在同一个服务器(设置为完全恢复模式)中使用另一个单独的数据库。然后,我将按常规计划在第二个数据库上设置备份。一个典型的备份计划是每周进行一次完全备份,每夜进行一次不同的备份,每15-30分钟进行一次事务备份,这取决于输入的数据量。)一定要定期测试恢复备份,在客户尖叫时学习如何恢复备份,因为数据库已关闭不是一件好事。

        2
  •  0
  •   Community Egal    7 年前

    我最终使用DDL触发器将更改从一个表复制到另一个表。唯一的问题是,如果一个表或列名包含一个保留字的一部分(varchar的arch),它将导致修改脚本出现问题。

    再次感谢 Brent Ozar 在我之前检查我的想法 blogged them .

    -- Create pvt and pvtWeb as test tables
    CREATE TABLE [dbo].[pvt](
       [VendorID] [int] NULL,
       [Emp1] [int] NULL,
       [Emp2] [int] NULL,
       [Emp3] [int] NULL,
       [Emp4] [int] NULL,
       [Emp5] [int] NULL
    ) ON [PRIMARY];
    GO
    
    
    CREATE TABLE [dbo].[pvtWeb](
       [VendorID] [int] NULL,
       [Emp1] [int] NULL,
       [Emp2] [int] NULL,
       [Emp3] [int] NULL,
       [Emp4] [int] NULL,
       [Emp5] [int] NULL
    ) ON [PRIMARY];
    GO
    
    
    IF EXISTS(SELECT * FROM sys.triggers WHERE name = ‘ddl_trigger_pvt_alter’)
       DROP TRIGGER ddl_trigger_pvt_alter ON DATABASE;
    GO
    
    -- Create a trigger that will trap ALTER TABLE events
    CREATE TRIGGER ddl_trigger_pvt_alter
    ON DATABASE
    FOR ALTER_TABLE
    AS
       DECLARE @data XML;
       DECLARE @tableName NVARCHAR(255);
       DECLARE @newTableName NVARCHAR(255);
       DECLARE @sql NVARCHAR(MAX);
    
       SET @sql = ”;
       -- Store the event in an XML variable
       SET @data = EVENTDATA();
    
       -- Get the name of the table that is being modified
       SELECT @tableName = @data.value(‘(/EVENT_INSTANCE/ObjectName)[1]‘, ‘NVARCHAR(255)’);
       -- Get the actual SQL that was executed
       SELECT @sql = @data.value(‘(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]‘, ‘NVARCHAR(MAX)’);
    
       -- Figure out the name of the new table
       SET @newTableName = @tableName + ‘Web’;
    
       -- Replace the original table name with the new table name
       -- str_replace is from Robyn Page and Phil Factor’s delighful post on 
       -- string arrays in SQL. The other posts on string functions are indispensible
       -- to handling string input
       --
       -- http://www.simple-talk.com/sql/t-sql-programming/tsql-string-array-workbench/
       -- http://www.simple-talk.com/sql/t-sql-programming/sql-string-user-function-workbench-part-1/
       --http://www.simple-talk.com/sql/t-sql-programming/sql-string-user-function-workbench-part-2/
       SET @sql = dbo.str_replace(@tableName, @newTableName, @sql);
    
       -- Debug the SQL if needed.
       --PRINT @sql;
    
       IF OBJECT_ID(@newTableName, N’U’) IS NOT NULL
       BEGIN
           BEGIN TRY
               -- Now that the table name has been changed, execute the new SQL
               EXEC sp_executesql @sql;
           END TRY
           BEGIN CATCH
               -- Rollback any existing transactions and report the full nasty 
               -- error back to the user.
               IF @@TRANCOUNT > 0
                   ROLLBACK TRANSACTION;
    
               DECLARE
                   @ERROR_SEVERITY INT,
                   @ERROR_STATE    INT,
                   @ERROR_NUMBER   INT,
                   @ERROR_LINE     INT,
                   @ERROR_MESSAGE  NVARCHAR(4000);
    
               SELECT
                   @ERROR_SEVERITY = ERROR_SEVERITY(),
                   @ERROR_STATE    = ERROR_STATE(),
                   @ERROR_NUMBER   = ERROR_NUMBER(),
                   @ERROR_LINE     = ERROR_LINE(),
                   @ERROR_MESSAGE  = ERROR_MESSAGE();
    
               RAISERROR(‘Msg %d, Line %d, :%s’,
                   @ERROR_SEVERITY,
                   @ERROR_STATE,
                   @ERROR_NUMBER,
                   @ERROR_LINE,
                   @ERROR_MESSAGE);
           END CATCH
       END
    GO
    
    
    
    
    ALTER TABLE pvt
    ADD test INT NULL;
    GO
    
    EXEC sp_help pvt;
    GO
    
    ALTER TABLE pvt
    DROP COLUMN test;
    GO
    
    EXEC sp_help pvt;
    GO