Вчера меня расстроила рассинхронизация базы данных. Библиотеки, используемые для разработки и тестирования, не одинаковы. В разработанной библиотеке часто обновляются хранимые процедуры. Иногда меняется даже структура таблицы.
Это приводит ко многим проблемам. Некоторое время я не знал, в чем конкретно заключается проблема, и это меня очень смутило. Мне вдруг захотелось написать программу для сравнения различий между двумя библиотеками, чтобы облегчить тестирование и реализацию.
Сегодня утром я писал во время встречи и сдал тест в полдень.
В основном два оператора SQL:
SQL с различными структурами таблиц и представлений, а также атрибутами столбцов в библиотеке запросов выглядит следующим образом:
выберите A. [имя] в качестве имени таблицы,
B. [имя] как Colname,
Б.хтип,
B.xusertype,
Б.длина,
Б.колид,
B.cdefault,
Б.домен,
Б.номер,
Б.смещение,
Б.статус,
Б.тип,
Б.тип пользователя,
Б.прек,
Б.шкала,
B.вычислено,
Б.изоутпарам,
B. недействительно,
C.COLUMN_DEFAULT,
dbo.fnIsColumnPrimaryKey(B. [ID], B. [имя]) как PKey
из системных объектов A, системных столбцов B, INFORMATION_SCHEMA.COLUMNS C
где a.id = B.id
и A.xtype in ('u', 'v')
и A. Имя = C.TABLE_NAME
и B. Имя = C.COLUMN_NAME.
заказ по А. [ID], Б. [Имя]
///////
Значение каждого столбца следующее:
name sysname Имя столбца или имя параметра процедуры.
id int Идентификатор объекта таблицы, которому принадлежит этот столбец, или идентификатор хранимой процедуры, связанный с этим параметром.
xtype tinyint Тип физического хранилища в systypes.
typestat tinyint Только для внутреннего использования.
xusertype smallint Расширенный идентификатор пользовательского типа данных.
length smallint Максимальная длина физической памяти в системных типах.
xprec tinyint Только для внутреннего использования.
xscale tinyint Только для внутреннего использования.
столбец colid smallint или идентификатор параметра.
xoffset smallint Только для внутреннего использования.
bitpos tinyint Только для внутреннего использования.
зарезервировано tinyint Только для внутреннего использования.
colstat smallint Только для внутреннего использования.
cdefault int Идентификатор значения по умолчанию для этого столбца.
домен int Идентификатор правила или ограничения CHECK этого столбца.
число smallint Номер подпроцесса, когда процесс сгруппирован (0 указывает на элементы, не относящиеся к процессу).
colorder smallint Только для внутреннего использования.
autoval varbinary(255) Только для внутреннего использования.
offset smallint Смещение строки, в которой расположен этот столбец, если оно отрицательное, указывает на строку переменной длины;
status tinyint Битовое изображение, описывающее атрибуты столбца или параметра:
0x08 = Столбец допускает нулевые значения.
0x10 = заполнение ANSI действует при добавлении столбца varchar или varbinary. Сохраняет конечные пробелы для столбцов varchar и конечные нули для столбцов varbinary.
0x40 = Параметр является ВЫХОДНЫМ параметром.
0x80 = Столбец является столбцом идентификаторов.
type tinyint Тип физического хранилища в systypes.
usertype smallint Идентификатор определяемого пользователем типа данных в systypes.
printfmt varchar(255) Только для внутреннего использования.
prec smallint Уровень точности этого столбца.
масштаб int Количество десятичных знаков для этого столбца.
iscomputed int Флаг, указывающий, был ли вычислен столбец:
0 = не рассчитывается.
1 = Рассчитано.
isoutparam int указывает, является ли параметр процедуры выходным параметром:
1 = правда.
0 = ложь.
isnullable int указывает, допускает ли столбец нулевые значения:
1 = правда.
0 = ложь.
COLUMN_DEFAULT значение по умолчанию
PKey Первичный ключ.
////////
Используются следующие функции:
--------------------------
СОЗДАТЬ ФУНКЦИЮ dbo.fnIsColumnPrimaryKey(@sTableID int, @nColumnName varchar(128))
--alter ФУНКЦИЯ dbo.fnIsColumnPrimaryKey(@sTableName varchar(128), @nColumnName varchar(128))
ВОЗВРАЩАЕТ бит
КАК
НАЧИНАТЬ
ОБЪЯВИТЬ @nTableID int,
@nIndexID целое число,
@я интервал
SET @nTableID = @sTableID --OBJECT_ID(@sTableName)
ВЫБЕРИТЕ @nIndexID = указанный
ИЗ системных индексов
ГДЕ id = @nTableID
И сделал МЕЖДУ 1 И 254
И (статус & 2048) = 2048
ЕСЛИ @nIndexID имеет значение NULL
ВОЗВРАТ 0
ЕСЛИ @nColumnName ВХ
(ВЫБЕРИТЕ sc.[имя]
ИЗ sysindexkeys сик
Системные столбцы INNER JOIN sc ON sik.id = sc.id И sik.colid = sc.colid
ГДЕ sik.id = @nTableID
И sik.indid = @nIndexID)
НАЧИНАТЬ
ВОЗВРАТ 1
КОНЕЦ
ВОЗВРАТА 0
КОНЕЦ
--------------------------
С помощью этого оператора SQL вы можете узнать атрибуты столбцов всех таблиц в базе данных.
Выполнив этот оператор SQL дважды соответственно, можно получить и сравнить атрибуты столбцов в двух библиотеках.
-------------------------------------------------- ---------------
Для хранимых процедур и функций используйте следующие операторы SQL:
выберите * из sysobjects, где xtype в ('P','TF','IF','FN') в порядке [Имя]
Все имена хранимых процедур и функций могут быть запрошены. Результаты запроса цикла,
В каждом цикле имя функции или хранимой процедуры сохраняется в строке SpobjectName, а затем вызывается хранимая процедура: sp_helptext выглядит следующим образом:
exec sp_helptext '" +SpobjectName+"'
Возвращает таблицу, содержащую текстовое содержимое хранимой процедуры SpobjectName. Одна строка текста в хранимой процедуре соответствует одной строке в таблице.
Выполните все SP и функции с помощью exec sp_helptext, чтобы получить коды всех хранимых процедур и функций.
Просто поместите результаты в таблицу и сравните сходства и различия.
Ссылка: Электронная документация по SQL Server.
<Автоматическое создание хранимых процедур в базе данных>( http://www.vckbase.com/document/viewdoc/?id=1111 )
Теперь мы сравниваем только атрибуты столбцов таблиц и представлений, а также хранимые процедуры и функции.
Связь ограничений между таблицами сравнения не реализована.
Будет добавлено позже.