Страница 1 из 1
MS SQL вопрос FK via PK
Добавлено: 15 апр 2003, 10:39
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 ?
Добавлено: 15 апр 2003, 12:36
папа Карло
внешний ключ не обязательно зависит от первичного ключа. он может зависить от любого ключа кандидата (уникального индекса с неопциональными полями например).
Добавлено: 15 апр 2003, 13:08
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
Добавлено: 15 апр 2003, 13:12
Lepsik
папа Карло писал(а):внешний ключ не обязательно зависит от первичного ключа. он может зависить от любого ключа кандидата (уникального индекса с неопциональными полями например).
я такие случаи пока не рассматриваю - пока не позволяю юзеру ээто делать
Добавлено: 15 апр 2003, 14:20
папа Карло
ответ на твой вопрос лежит в sysforeignkeys с нее прыгнешь на syscolumns. и в той и в той таблице есть порядок аттрибутов в ключе и в самих таблицах.
Добавлено: 16 апр 2003, 08:01
Lepsik
а ты случайно не знаешь как вытащить запросом результат запроса из второго рекордсета ?
exec sp_helpconstraint 'my_slave_table'
Добавлено: 16 апр 2003, 10:01
папа Карло
не не знаю.

да и зачем? я подобные вещи всегда сам делал. Не знаешь как квери написать, посмотри исходник 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
удачи!
Добавлено: 16 апр 2003, 10:28
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)
Добавлено: 16 апр 2003, 10:48
папа Карло
Query Analyzer -> Tools -> Options -> Results Tab
Maximum characters per column: Set 8000.
Добавлено: 16 апр 2003, 11:32
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
что-то ничего придумать не могу
тогда бы человечество стало бы счастливие на одну задачу
Добавлено: 16 апр 2003, 11:51
папа Карло
Лепс, ну прочитай хоть одну книжку про сиквел.

этож опупеть... видит пересечение двух селектов и заджойнить не может

признайся ты специально на это народ разводишь или действительно не знаешь БД? если не знаешь, то че ты ими занимаешься?
Код: Выделить всё
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
Добавлено: 16 апр 2003, 12:16
Lepsik
спасибо.
>Лепс, ну прочитай хоть одну книжку про сиквел. этож опупеть... видит пересечение двух селектов и заджойнить не может признайся ты специально на это народ разводишь или действительно не знаешь БД? если не знаешь, то че ты ими занимаешься?
да уже вагон прочитал. еслибы я только одними базами занимался
базы - так семечки, раз месяц припекет. а уже все забыть успел