2008-10-28 48 views
0

我有一组用于跟踪帐单的表。这些表格是从每周运行的SSIS进程加载的。镜像表修改

我在创建第二组表来跟踪调整到通过网络提出的法案的过程。我们的一些客户手中输入账单,所有这些条目都需要定期备份(SSIS提供的数据总是可以再次导入,因此不会备份)。

这种行为是否有最佳做法?我正在寻找实现DDL触发器,它将解析ALTER TABLE调用并更改被调用的表。这有点痛苦,如果有更好的方法,我很好奇。

回答

0

我结束了使用DDL触发器从一个表到另一个表的变化副本。唯一的问题是,如果表或列名称包含保留字的一部分 - ARCH for VARCHAR - 则会导致修改脚本出现问题。

感谢,再次之前,我blogged themBrent Ozar错误检查我的想法。

-- 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 
1

我个人将有在一个数据库中相同的服务器上的SSIS馈表(设置为简单恢复模式)和其他表中的一个单独的数据库,其被设置为完全恢复模式,。然后,我会定期在第二个数据库上设置备份。典型的备份时间表将每周进行一次完整备份,每晚不同,每15-30分钟进行一次事务备份,具体取决于输入的数据量。)请务必定期测试恢复备份,了解如何在客户尖叫,因为数据库倒塌不是好事。