Я использовал решение Монтаго, но преобразовал его в код 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
Это будет искать только таблицы, которые на самом деле синхронизируются