powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / CONSTRAINS_KEYS better then CONSTARAINT_NAME???
20 сообщений из 20, страница 1 из 1
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037292
Irena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Нависла проблема - надо сравнить CONSTRAINS в двух БД. Эти БД по структуре одинаковые, но Вася Пупкин, решил когда-то попить кофе,а заодно освободить таблицы от противных Констрейнов...
Вася уже не помнит что такие Констрейны, но востановить их все же надо...и при чем - мне:((

Если сравнивать имена, то ничего не видно - у них есть ID. Как я понимаю - это какие-то системные ID и нет смысла их сравнивать... тем более, когда мне придеться восстанавливать CONSTRAINS после получения информации о разности...
Была идея сравнить CONSTRAINS_KEYS вместо NAMES, но боюсь, что информации о том на куда их вешать тоже не получиться...А если и получиться, так только способом перебора всех по одной таблиц...:-0

Вопрос - нельзя ли каким-нибудь боком или раком сравнить констрейны и получить инфу с образцовой БД (на которой констрейны сохранились) на чем они навешены?
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037300
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp_help для обоих таблиц ....
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037302
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
данный запрос
Код: plaintext
1.
2.
3.
4.
5.
select * 
from INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE  a
left outer join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b on b.CONSTRAINT_NAME = a.CONSTRAINT_NAME
left outer join INFORMATION_SCHEMA.CHECK_CONSTRAINTS c on c.CONSTRAINT_NAME = a.CONSTRAINT_NAME
left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS d on d.CONSTRAINT_NAME = a.CONSTRAINT_NAME


выдаст наверное слишком много информации, но много, не мало, можно и убрать ненужное

например вывести только PRIMARY KEY констрайнты
Код: plaintext
1.
2.
3.
4.
select a.CONSTRAINT_NAME, b.column_name
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS a
inner join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
where a.CONSTRAINT_TYPE = 'PRIMARY KEY'


или только связки PK_FK
Код: plaintext
1.
2.
3.
4.
select a.constraint_name, a.table_name as FK_Table, a.column_name AS FK_column,c.table_name AS PK_Table, c.column_name AS PK_column
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a 
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b on b.constraint_name = a.constraint_name
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE c on c.constraint_name = b.unique_constraint_name
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037585
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если таблицы на разных серверах, то через INFORMATION_SCHEMA не очень то получиться, так как имена в схеме имеют идентификационный номер от сервера, в результате чего равными оказываються только некоторые из истинно равных...:(
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037589
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"идентификационный номер от сервера" это OBJECT ID ?

А причем здесь он ? Я так понял вы хотите для таблицы в одной базе(сервере) проверить какие констрайнты имеются у таблицы с таким же именем в другой базе(сервере) ? Или у вас и имена таблиц разные ?
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037598
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вроде такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select *
from
(select a.table_catalog AS A_Catalog, a.table_name AS A_table, a.CONSTRAINT_NAME AS A_CONSTRAINT_NAME, b.column_name AS A_Column_name
from pubs.INFORMATION_SCHEMA.TABLE_CONSTRAINTS a
inner join pubs.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
where a.CONSTRAINT_TYPE = 'PRIMARY KEY' ) a
left outer join 
OPENQUERY(mylinkedserver, 'select a.table_catalog AS B_Catalog, a.table_name AS B_table, a.CONSTRAINT_NAME AS B_CONSTRAINT_NAME, b.column_name AS B_Column_name
from pubs.INFORMATION_SCHEMA.TABLE_CONSTRAINTS a
inner join pubs.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
where a.CONSTRAINT_TYPE = ''PRIMARY KEY''') b 
ON b.table_catalog = a.table_catalog AND b.table_name= a.table_name
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037601
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправочка
Код: plaintext
1.
ON b.b_catalog = a.a_catalog AND b.b_table= a.a_table
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037968
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1)И имена разные и сервера...
2) а про номер я имею в виду, что получаеться из INFORMATION_SCHEMA ключи типа FK_ANR_12345
и например тот же,но с другой базы
FK_ANR_54321
:(
PS: извеняюсь за молчание
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037983
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Irena

Поставь себе Power Designer, потом в меню файл выбери Revers Engineer -> Database, сгенери по каждой базе свою модель, а затем в меню tools есть пункт Compare Models, в котором модели можно сравнить. Здесь же можно сгенерить скрипт, который поможет перенести отличия из одной базы в другую. И вообще Power Designer очень мощный инструмент, который облегчает жизнь как архитектору БД, так и DBA.

З.ы. Все что я сказал можно конечно сделать и другими CASE средствами, просто я лучше всего знаю Power Designer.
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32037986
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)И имена разные и сервера...

Как обратится к другому серверу через OPENQUERY и linked server я вам вроде бы показал.
Но если и имена таблиц, хранящих одни и те же данные, у вас на разных серверах разнятся, то тут IMHO никакая компьютерная логика не справится. Можно конечно составить таблицу соответсвий, т.е. какой таблице на первом серевере соответствует таблица на втором сервере.

ключи типа FK_ANR_12345 и например тот же,но с другой базы FK_ANR_54321

- каждый констрайнт имеет уникальное имя в пределах базы
- если вы не задаете это имя явно, то сервер генерирует его сам и для подстраховки добавляет в конец случайное число

К тому же не пойму, зачем вам сравнивать по полному имени констрайнта, если можно сравнивать только по имени таблицы (пусть и через какой-то механизм разрешения имен) и количеству и именам входящих в констрайнт столбцов.
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038000
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблицы, слава богу, называються так же, но храняться на разных серверах в разно именованных базах...

так,пока не запуталась, спрошу с другой стороны...
Как сделать

> ...если можно сравнивать только по имени таблицы (пусть и через какой-то механизм разрешения имен) и количеству и именам входящих в констрайнт столбцов
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038006
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
by the way - thatnk You very much!!!!!!
I already try first query from You...seems have only some linked server problems, but I think it is from my side is not ok:)
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038058
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HELP!
Процедура возвращает NULL для всего B сектора!!!!

Не ругаеться ни на сервер_линкед ни на имя базы - похоже, что все находит....
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038100
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Показывайте ваш код
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038112
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SELECT *
FROM
	(SELECT 
		a.table_catalog AS A_Catalog, 
		a.table_name AS	A_table,
		a.CONSTRAINT_NAME AS A_CONSTRAINT_NAME, 
		b.column_name AS A_Column_name
	FROM 
		TEST1.INFORMATION_SCHEMA.TABLE_CONSTRAINTS a
	INNER JOIN 
		TEST1.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b 
	ON 
		a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
	WHERE 
		a.CONSTRAINT_TYPE = 'FOREIGN KEY' 
	) a
 
FULL JOIN
OPENQUERY
	(SERVER_my 
		'SELECT 
		a.table_catalog AS B_Catalog, 
		a.table_name AS B_table, 
		a.CONSTRAINT_NAME AS B_CONSTRAINT_NAME, 
		b.column_name AS B_Column_name
	FROM 
		TEST2.INFORMATION_SCHEMA.TABLE_CONSTRAINTS a
	INNER 
		JOIN TEST2.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
	WHERE 
		a.CONSTRAINT_TYPE = ''FOREIGN KEY''') b 
ON b.b_catalog = a.a_catalog AND b.b_table= a.a_table


Да, немного я поменяла, а для моих сервров возвращает так, что толко по полному FULL JOIN можно догадаться, что работает...Или я что то не улавливаю про джоины....?
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038115
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну раз у вас только базы именуются по-разному, а таблицы - одинаково то
соединение по b.b_catalog = a.a_catalog можно опустить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SELECT *
FROM
	(SELECT 
		a.table_catalog AS A_Catalog, 
		a.table_name AS	A_table,
		a.CONSTRAINT_NAME AS A_CONSTRAINT_NAME, 
		b.column_name AS A_Column_name
	FROM 
		TEST1.INFORMATION_SCHEMA.TABLE_CONSTRAINTS a
	INNER JOIN 
		TEST1.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b 
	ON 
		a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
	WHERE 
		a.CONSTRAINT_TYPE = 'FOREIGN KEY' 
	) a
 
LEFT OUTER JOIN
OPENQUERY
	(SERVER_my 
		'SELECT 
		a.table_catalog AS B_Catalog, 
		a.table_name AS B_table, 
		a.CONSTRAINT_NAME AS B_CONSTRAINT_NAME, 
		b.column_name AS B_Column_name
	FROM 
		TEST2.INFORMATION_SCHEMA.TABLE_CONSTRAINTS a
	INNER 
		JOIN TEST2.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
	WHERE 
		a.CONSTRAINT_TYPE = ''FOREIGN KEY''') b 
ON b.b_table= a.a_table


просто придется визуально следить чтобы каждый из запросов выбирал данные из нужной базы.
Можно конечно и FULL JOIN использовать, но IMHO лучше(т.е. нагляднее для анализа) 2 запроса
от
"TEST1" LEFT OUTER JOIN "TEST2"
и наоборот
"TEST2" LEFT OUTER JOIN "TEST1"

P.S.
А нельзя поступить более радикально ?

- заскриптовать все констрайнты в TEST1
- удалить все констрайнты в TEST2
- применить на TEST2 скрипт, полученный для TEST1
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038125
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и этого я не могу сама....
>- заскриптовать все констрайнты в TEST1
....
вернее я могу, конечно, ручками все...но ведь наверняка есть способ побыстрее....
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038287
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
ALTER TABLE [user].[table1] ADD  FOREIGN KEY 
	(
		[column1]
	) REFERENCES [table2] (
		[column2]
	)
GO

и так для 2000 таблиц?[src][/src]
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038292
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.Ну выберите в EM базу, на правой кнопке мыши есть пункт меню Generate SQL Script. В опциях можно убрать из скрипта собственно создание таблицы (т.е. никаких CREATE TABLE не будет). Выбираем в качестве объектов только таблицы и получаем скрипт сразу для всех

Проблемы могут быть с тем, что в скрипте изменение таблиц идет в алфавитном порядке. А вот создавать констрайнты, особенно PK-FK нужно в заданном порядке. Но сам скрипт уже имеется, так что можно и поредактировать вручную. Не ахти, но все же

2. Кроме того, можно попробовать следующий вариант
- делаем архив 2-ой базы (это на всякий случай)
- выгружаем все данные через bcp или DTS в текстовые файлы
- переносим из 1-ой базы стуктуры всех таблиц (через скрипт или опять же DTS)
- добавляем в "новые" таблицы 2-ой базы данные из созданных ранее текстовых файлов через bulk insert без проверки констрайнтов
Слабое место данного метода - если количество, типы и порядок столбцов в идентичных таблицах разных баз отличаются

3. Можно автоматизировать процесс скриптования. Все данные теоритически можно взять их системных таблиц.

А в SQL-DMO вообще есть метод GenerateSQL. Можно написать приложение, которое будет генерировать скрипты.

4.
Ну и конечно можно искать продукт от 3-ей фирмы (кажется jimmers недавно советовал что-то такое). Возможно даже чья-то evalution копия справится с вашей проблемой, ну тут 50 на 50
...
Рейтинг: 0 / 0
CONSTRAINS_KEYS better then CONSTARAINT_NAME???
    #32038769
Irena_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так делала...
Генерила скрипт н удаление другим скриптом, потом генерила скрипт из EM на создание(из образцовой базы) и применяла на испытуемой. Пришлось все ненужные из скрипта руками выбрасывать:(
Спасибо!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / CONSTRAINS_KEYS better then CONSTARAINT_NAME???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]