MS SQL вопрос FK via PK

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

MS SQL вопрос FK via PK

Сообщение Lepsik »

не могу найти список соответствия полей

могу найти master tables

select b1.name, b2.name
from (select sysreferences.constid as id1, sysreferences.fkeyid as id2
from sysobjects left join sysreferences on sysobjects.id=sysreferences.rkeyid where sysobjects.name='slave table') as val, sysobjects as b1, sysobjects as b2 WHERE val.id1 = b1.id and val.id2 = b2.id

могу найти список FK по констрейну

SELECT DISTINCT COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME='slave_table' AND C

и могу найти PK по имени master table

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu, INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc WHERE C and cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND cu.TABLE_NAME='master_table_1' ORDER BY ORDINAL_POSITION

а вот как понять какое поле в FK какому соответствует в PK ?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

внешний ключ не обязательно зависит от первичного ключа. он может зависить от любого ключа кандидата (уникального индекса с неопциональными полями например).
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

проблема в том что я должен знать зависимость.

у меня slave table имеет 3 мастера

более того ключи пересекаются.

есть такой вариант
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

но он дает пересечение, то нужный порядок как в :
sp_helpconstraint your_table_name

получить не удается.
я знаю имя констрейна, имя мастер таблицы, точно порядок полей в PK мастер таблицы - мне надо к этому порядку привязать порядок полей в FK
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

папа Карло писал(а):внешний ключ не обязательно зависит от первичного ключа. он может зависить от любого ключа кандидата (уникального индекса с неопциональными полями например).
я такие случаи пока не рассматриваю - пока не позволяю юзеру ээто делать
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

ответ на твой вопрос лежит в sysforeignkeys с нее прыгнешь на syscolumns. и в той и в той таблице есть порядок аттрибутов в ключе и в самих таблицах.
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

а ты случайно не знаешь как вытащить запросом результат запроса из второго рекордсета ?

exec sp_helpconstraint 'my_slave_table'
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

не не знаю. :) да и зачем? я подобные вещи всегда сам делал. Не знаешь как квери написать, посмотри исходник sp_helpconstraint. Сделать это _очень_ просто.

Код: Выделить всё

select
	sc.text
from
	master..sysobjects so,
	master..syscomments sc
where
	so.name = 'sp_helpconstraint' and
	so.type = 'P' and
	sc.id = so.id
order by
	sc.colid
удачи!
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

а почему выдает какой-то покоцанный текст ?
часть переменных не определена (fkeycol, @rkeycol) ? :(



/*-----------------------------
select
sc.text
from
-----------------------------*/
text
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
create proc sp_helpconstraint
@objname nvarchar(776) -- the table to check for constraints
,@nomsg varchar(5) = 'msg' -- 'nomsg' supresses printing of TBName (sp_help)
as
-- PRELIMfkeycol, @rkeycol
set nocount on

declare @objid int -- the

select @keys = col_name(@fkeyid, @fkeycol), @cnstdes = col_name(@rkeyid, @rkeycol)
fetch ms_crs_fkey into @fkeycol, @rkeycol
while @@fetch_status >= 0
begin
select @keys = @keys + ', ' + col_name(@fkeyid, @fkeycol),
here c.id = @objid and m.id = c.domain and ObjectProperty(c.domain, 'IsRule') = 1

insert into #spcnsttab (cnst_id,cnst_type,cnst_name,cnst_nonblank_name,cnst_keys, cnst_2type)
select c.cdefault, 'DEFAULT on column ' + c.name + ' (bound with sp_bindef

(3 row(s) affected)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Query Analyzer -> Tools -> Options -> Results Tab

Maximum characters per column: Set 8000.
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

спасибо. но вот наковырял по твоей наводке

select name from syscolumns left join sysforeignkeys on syscolumns.colid=sysforeignkeys.fkey where id=340196262 and sysforeignkeys.constid=868198143

select name from syscolumns left join sysforeignkeys on syscolumns.colid=sysforeignkeys.rkey where id=388196433 and sysforeignkeys.constid=868198143

как бы

a
b
c

d
e
g

перевернуть в

a, d
b, e
c, g

что-то ничего придумать не могу
тогда бы человечество стало бы счастливие на одну задачу
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Лепс, ну прочитай хоть одну книжку про сиквел. :) этож опупеть... видит пересечение двух селектов и заджойнить не может :) признайся ты специально на это народ разводишь или действительно не знаешь БД? если не знаешь, то че ты ими занимаешься? :)

Код: Выделить всё

select
	rkeys.name as ref_col,
	fkeys.name as frn_col
from
	sysforeignkeys sf,
	syscolumns rkeys,
	syscolumns fkeys
where
	sf.constid = 868198143 and
	rkeys.id = sf.rkeyid and
	rkeys.colid = sf.rkey and
	fkeys.id = sf.fkeyid and
	fkeys.colid = sf.fkey
order by
	sf.keyno
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

спасибо.

>Лепс, ну прочитай хоть одну книжку про сиквел. этож опупеть... видит пересечение двух селектов и заджойнить не может признайся ты специально на это народ разводишь или действительно не знаешь БД? если не знаешь, то че ты ими занимаешься?

да уже вагон прочитал. еслибы я только одними базами занимался :(

базы - так семечки, раз месяц припекет. а уже все забыть успел
Ответить