我有一组用于跟踪帐单的表。这些表格是从每周运行的SSIS进程加载的。镜像表修改
我在创建第二组表来跟踪调整到通过网络提出的法案的过程。我们的一些客户手中输入账单,所有这些条目都需要定期备份(SSIS提供的数据总是可以再次导入,因此不会备份)。
这种行为是否有最佳做法?我正在寻找实现DDL触发器,它将解析ALTER TABLE调用并更改被调用的表。这有点痛苦,如果有更好的方法,我很好奇。
我有一组用于跟踪帐单的表。这些表格是从每周运行的SSIS进程加载的。镜像表修改
我在创建第二组表来跟踪调整到通过网络提出的法案的过程。我们的一些客户手中输入账单,所有这些条目都需要定期备份(SSIS提供的数据总是可以再次导入,因此不会备份)。
这种行为是否有最佳做法?我正在寻找实现DDL触发器,它将解析ALTER TABLE调用并更改被调用的表。这有点痛苦,如果有更好的方法,我很好奇。
我结束了使用DDL触发器从一个表到另一个表的变化副本。唯一的问题是,如果表或列名称包含保留字的一部分 - ARCH for VARCHAR - 则会导致修改脚本出现问题。
感谢,再次之前,我blogged them到Brent 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
我个人将有在一个数据库中相同的服务器上的SSIS馈表(设置为简单恢复模式)和其他表中的一个单独的数据库,其被设置为完全恢复模式,。然后,我会定期在第二个数据库上设置备份。典型的备份时间表将每周进行一次完整备份,每晚不同,每15-30分钟进行一次事务备份,具体取决于输入的数据量。)请务必定期测试恢复备份,了解如何在客户尖叫,因为数据库倒塌不是好事。