我已经设置了与Microsoft Sync Framework的同步,现在我需要向表中添加字段。 如何重新配置数据库?
设置非常简单:
SqlSyncProvider
我是否在两端进行结构改变?或者我只更改一台服务器并让Sync Framework以某种方式传播更改?
我是否需要删除_tracking
表和/或存储过程?触发器怎么样?
有没有人使用过Sync Framework?请帮忙。
答案 0 :(得分:2)
答案 1 :(得分:0)
删除范围并重新提供...使用此代码删除范围
private void RemoveScope(SqlConnection Conn, bool ShowAlert)
{
foreach (var table in _settings.TablesToSync)
{
SqlCommand dropTracking = new SqlCommand(@"
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_tracking]') AND type in (N'U'))
DROP TABLE [dbo].[" + table.Key + "_tracking]", Conn);
dropTracking.ExecuteNonQuery();
SqlCommand dropTriggers = new SqlCommand(@"
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_delete_trigger]'))
DROP TRIGGER [dbo].[" + table.Key + @"_delete_trigger];
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_insert_trigger]'))
DROP TRIGGER [dbo].[" + table.Key + @"_insert_trigger];
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_update_trigger]'))
DROP TRIGGER [dbo].[" + table.Key + @"_update_trigger];
", Conn);
dropTriggers.ExecuteNonQuery();
SqlCommand dropStoredProc = new SqlCommand(@"
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_delete]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_delete];
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_deletemetadata]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_deletemetadata];
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_insert]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_insert];
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_insertmetadata]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_insertmetadata];
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_selectchanges]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_selectchanges];
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_selectrow]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_selectrow];
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_update]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_update];
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + table.Key + @"_updatemetadata]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[" + table.Key + @"_updatemetadata];
", Conn);
dropStoredProc.ExecuteNonQuery();
}
SqlCommand getScopeGuid = new SqlCommand(@"
USE [" + Conn.Database + @"]
SELECT scope_config_id FROM scope_info WHERE scope_name = '" + _settings.ScopeName + "'", Conn);
var reader = getScopeGuid.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
var id = reader.GetGuid(0);
reader.Close();
SqlCommand deleteScope = new SqlCommand(@"
DELETE FROM scope_info WHERE scope_config_id = '" + id + @"';
DELETE FROM scope_config WHERE config_id = '" + id + @"';
", Conn);
deleteScope.ExecuteNonQuery();
}
if(ShowAlert)
MessageBox.Show("Scope has been removed");
}
答案 2 :(得分:0)
我使用过Montago的解决方案,但是将其转换为SQL代码,它为我完成了这项工作。可以自由使用它,我希望它可以帮助你:)
USE DatabaseName
GO
DECLARE @sqlDrop VARCHAR(1000)
SET @sqlDrop = 'IF EXISTS (SELECT * FROM #table# WHERE object_id = OBJECT_ID(''#name#'')) DROP #what# #name#'
DECLARE @sqlCommand VARCHAR(1000)
DECLARE @id INT
SET @id = 0
DECLARE @name SYSNAME
DECLARE @prev INT
WHILE 1 = 1
BEGIN
/* find traces of synchronization */
-- to be sure that id changed
SET @prev = @id
-- get the next table
SELECT TOP 1
@id = object_id,
@name = name
FROM sys.tables
WHERE object_id > @id
ORDER BY object_id
-- confirm that there is next table
IF @id = @prev
BREAK
/* remove traces of synchronization */
-- remove table
SET @sqlCommand = @sqlDrop
SET @sqlCommand = REPLACE(@sqlCommand, '#table#', 'sys.tables')
SET @sqlCommand = REPLACE(@sqlCommand, '#name#', @name + '_tracking')
SET @sqlCommand = REPLACE(@sqlCommand, '#what#', 'TABLE')
EXEC (@sqlCommand)
-- remove triggers
SET @sqlCommand = @sqlDrop
SET @sqlCommand = REPLACE(@sqlCommand, '#table#', 'sys.triggers')
SET @sqlCommand = REPLACE(@sqlCommand, '#name#', @name + '_delete_trigger')
SET @sqlCommand = REPLACE(@sqlCommand, '#what#', 'TRIGGER')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_delete_trigger', '_insert_trigger')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_insert_trigger', '_update_trigger')
EXEC (@sqlCommand)
-- remove stored procedures
SET @sqlCommand = @sqlDrop
SET @sqlCommand = REPLACE(@sqlCommand, '#table#', 'sys.procedures')
SET @sqlCommand = REPLACE(@sqlCommand, '#name#', @name + '_delete')
SET @sqlCommand = REPLACE(@sqlCommand, '#what#', 'PROCEDURE')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_delete', '_deletemetadata')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_deletemetadata', '_insert')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_insert', '_insertmetadata')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_insertmetadata', '_selectchanges')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_selectchanges', '_selectrow')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_selectrow', '_update')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_update', '_updatemetadata')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_updatemetadata', '_bulkdelete')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_bulkdelete', '_bulkinsert')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, '_bulkinsert', '_bulkupdate')
EXEC (@sqlCommand)
END
-- remove scope and schema tables
SET @sqlCommand = @sqlDrop
SET @sqlCommand = REPLACE(@sqlCommand, '#table#', 'sys.tables')
SET @sqlCommand = REPLACE(@sqlCommand, '#name#', 'schema_info')
SET @sqlCommand = REPLACE(@sqlCommand, '#what#', 'TABLE')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, 'schema_info', 'scope_config')
EXEC (@sqlCommand)
SET @sqlCommand = REPLACE(@sqlCommand, 'scope_config', 'scope_info')
EXEC (@sqlCommand)
正如您所看到的那样,遍历所有表并尝试查找同步的痕迹。您只需要更改数据库名称(第一行)。 此外,如果您希望删除的内容更安全,请使用此代码查找表格:
-- get the next table
SELECT TOP 1
@id = object_id,
@name = REPLACE(name, '_tracking', '')
FROM sys.tables
WHERE object_id > @id
AND name LIKE '%_tracking'
ORDER BY object_id
这只会查找实际正在同步的表
答案 3 :(得分:0)
您可以使用此脚本:
declare @SQL varchar(max);
set @SQL='';
select @SQL += ' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[schema_info]'') AND type in (N''U'')) ' +
' DROP TABLE [dbo].[schema_info]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[scope_config]'') AND type in (N''U'')) ' +
' DROP TABLE [dbo].[scope_config]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[scope_info]'') AND type in (N''U'')) ' +
' DROP TABLE [dbo].[scope_info]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_tracking]'') AND type in (N''U'')) ' +
' DROP TABLE [dbo].[' + name + '_tracking]; ' +
' IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_delete_trigger]'')) ' +
' DROP TRIGGER [dbo].[' + name + '_delete_trigger];' +
' IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_insert_trigger]'')) ' +
' DROP TRIGGER [dbo].[' + name + '_insert_trigger]; ' +
' IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_update_trigger]'')) ' +
' DROP TRIGGER [dbo].[' + name + '_update_trigger]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_delete]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_delete]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_deletemetadata]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_deletemetadata]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_insert]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_insert]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_insertmetadata]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_insertmetadata]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_selectchanges]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_selectchanges]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_selectrow]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_selectrow]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_update]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_update]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_updatemetadata]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_updatemetadata]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_BulkType]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_BulkType]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_bulkinsert]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_bulkinsert]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_bulkupdate]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_bulkupdate]; ' +
' IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + name + '_bulkdelete]'') AND type in (N''P'', N''PC'')) ' +
' DROP PROCEDURE [dbo].[' + name + '_bulkdelete]; '
from sysobjects
where type = 'U'
--select @SQL
EXEC(@SQL)
GO