Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Определить связи полей таблицы  [new]
A13xSun
Member

Откуда:
Сообщений: 20
Есть 2 связанные 1-М таблицы, соответственно одно поле второй таблицы может принимать только одно из значений связанного поля первой.
Как с помощью SQL запроса узнать какое это поле, чтоб потом получить перечень его возможных значений?
1 июн 13, 13:39    [14378865]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
A13xSun
Есть 2 связанные 1-М таблицы
Связанные констрейнами?
Тогда посмотрите на вьюхи INFORMATION_SCHEMA, в частности CONSTRAINT_COLUMN_USAGE и REFERENTIAL_CONSTRAINTS
1 июн 13, 13:59    [14378904]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
A13xSun
Member

Откуда:
Сообщений: 20
alexeyvg
A13xSun
Есть 2 связанные 1-М таблицы
Связанные констрейнами?
Тогда посмотрите на вьюхи INFORMATION_SCHEMA, в частности CONSTRAINT_COLUMN_USAGE и REFERENTIAL_CONSTRAINTS

Что такое констрейны? :)
Связывал при создании, в одной таблице поле PRIMARY KEY, во второй FOREIGN KEY REFERENCES.
Понял о чем Вы говорите, посмотрел в студии CONSTRAINT_COLUMN_USAGE, там перечень таблиц и ключевых полей, но без названий привязанных таблиц, откуда они. А как я вытащу перечень значений поля из таблицы, если не знаю ее имени?
1 июн 13, 14:09    [14378918]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
varta
Member [заблокирован]

Откуда:
Сообщений: 33
A13xSun,

use mydatabase
select *from information_schema.tables
1 июн 13, 14:14    [14378932]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
A13xSun
Member

Откуда:
Сообщений: 20
varta
A13xSun,

use mydatabase
select *from information_schema.tables

Что это, зачем мне просто список таблиц?..
1 июн 13, 14:16    [14378938]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
A13xSun
Member

Откуда:
Сообщений: 20
Сейчас из CONSTRAINT_COLUMN_USAGE я могу получить имена привязанных полей нужной мне таблицы, но не название таблицы откуда это привязанное поле. Вот его мне нужно, чтоб выполнить запрос на выборку всех значений этого поля.
1 июн 13, 14:21    [14378950]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
A13xSun
Что это, зачем мне просто список таблиц?..


Вам дали направление для копания. Представления схемы INFORMATION_SCHEMA. Будете дальше ждать готового решения, или приложете хоть какие-нибудь усилия к его поиску?!
1 июн 13, 14:22    [14378956]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
A13xSun
Member

Откуда:
Сообщений: 20
pkarklin
A13xSun
Что это, зачем мне просто список таблиц?..


Вам дали направление для копания. Представления схемы INFORMATION_SCHEMA. Будете дальше ждать готового решения, или приложете хоть какие-нибудь усилия к его поиску?!

Уже приложил, вроде разобрался, осталось написать запрос.
Спасибо всем!
1 июн 13, 14:27    [14378961]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
A13xSun
Member

Откуда:
Сообщений: 20
Вот оно, если кому пригодиться:
SELECT [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE].[COLUMN_NAME]
  FROM [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS], [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE]
WHERE [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE].[TABLE_NAME] = 'Имя_таблицы'
AND [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[CONSTRAINT_NAME] = [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE].[CONSTRAINT_NAME]
1 июн 13, 14:32    [14378967]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
A13xSun,

Настоятельно рекомендую переходить на ANSI JOIN syntax.
1 июн 13, 14:36    [14378974]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
pkarklin
A13xSun,

Настоятельно рекомендую переходить на ANSI JOIN syntax.
И алиасы
1 июн 13, 17:07    [14379169]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Добрый день.
Похожая проблема: пытаюсь удалить столбец
ALTER TABLE dbo.ToolsStoragePostingSpec DROP COLUMN ToolsSPID

Выдает:
Ошибка ALTER TABLE DROP COLUMN ToolsSPID, так как один или несколько объектов обращаются к данному столбцу.
Как определить, какие объекты обращаются к данному столбцу. Сведения из информационной схемы выдают одно поле: TmID
6 июн 13, 07:38    [14397700]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Lily V.,

А разве перед этим не выдаются ошибки с перечислением объектов?

set language Russian;

use tempdb;

create table dbo.parent (parent_id int constraint pk_parent primary key);

create table dbo.child
(  child_id int constraint pk_child primary key,
   parent_id int constraint fk_child_parent foreign key (parent_id) references dbo.parent(parent_id)
);

create index i on dbo.child(parent_id);
go
alter table dbo.child drop column parent_id;
go
drop table dbo.child, dbo.parent;

Параметры языка изменены на "русский".
Msg 5074, Level 16, State 1, Line 1
индекс "i" зависит от столбец "parent_id".
Msg 5074, Level 16, State 1, Line 1
объект "fk_child_parent" зависит от столбец "parent_id".
Msg 4922, Level 16, State 9, Line 1
Ошибка ALTER TABLE DROP COLUMN parent_id, так как один или несколько объектов обращаются к данному столбцу.
6 июн 13, 12:35    [14399236]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Гость333
Lily V.,

А разве перед этим не выдаются ошибки с перечислением объектов?
...скип...


Выдается, но информативности от него мало)
Сообщение 5074, уровень 16, состояние 1, строка 1
объект "minus1" зависит от столбец "ToolsSPID".
Сообщение 4922, уровень 16, состояние 9, строка 1
Ошибка ALTER TABLE DROP COLUMN ToolsSPID, так как один или несколько объектов обращаются к данному столбцу.
Что за объект minus1..? Где его искать, не очень понятно
7 июн 13, 06:20    [14403427]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Lily V.,

select * from sys.objects where name = 'minus1'

будет поле type вроде или type_desc из него поймете что это за объект
7 июн 13, 08:01    [14403520]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Алексей Куренков
Lily V.,

select * from sys.objects where name = 'minus1'

будет поле type вроде или type_desc из него поймете что это за объект


Данный запрос выдал, что это DEFAULT_CONSTRAINT. Это особо не проясняет ситуацию.
Как я и предполагала раньше, это связано с пользовательским типом данных данного поля, У нас в базе для полей-идентификаторов используется тип type_id. Вот его (поле) я и пытаюсь удалить. Что за DEFAULT_CONSTRAINT... думаю, вопрос уже к нашим данным. Спасибо, всем, кто пытался помочь
7 июн 13, 09:31    [14403886]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Lily V.,

Выполните команду
ALTER TABLE dbo.ToolsStoragePostingSpec DROP CONSTRAINT minus1

После чего снова попробуйте удалить столбец.
7 июн 13, 09:43    [14403961]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3348
Lily V.,

Не проясняет? Это значение по умолчанию для столбца.
ALTER TABLE dbo.ToolsStoragePostingSpec DROP constraint minus1;
go
7 июн 13, 09:43    [14403964]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Ennor Tiegael
Lily V.,

Не проясняет? Это значение по умолчанию для столбца.
ALTER TABLE dbo.ToolsStoragePostingSpec DROP constraint minus1;
go

Не получается удалить minus1 как constraint:
Сообщение 3728, уровень 16, состояние 2, строка 1
minus1 не является ограничением.
7 июн 13, 10:38    [14404380]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
Lily V.
Не получается удалить minus1 как constraint:
Сообщение 3728, уровень 16, состояние 2, строка 1
minus1 не является ограничением.

Значит, вы ошиблись с этим:
Lily V.
Данный запрос выдал, что это DEFAULT_CONSTRAINT
7 июн 13, 10:41    [14404397]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
alexeyvg,

select type_desc from sys.objects where name = 'minus1'

Выдает результат, что это:
DEFAULT_CONSTRAINT

Однако, данный констрейнт не относится напрямую к таблице ToolsStoragePostingSpec. Оно относится к используемому пользовательскому типу поля ToolsSPID. При попытке удалить его таким образом:
ALTER TABLE dbo.ToolsStoragePostingSpec DROP constraint minus1
соответственно выдается ошибка
7 июн 13, 10:48    [14404470]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lily V.
Выдает результат, что это:
DEFAULT_CONSTRAINT

Приведите лучше скрипт создания вашей таблицы сгенерированный студией
7 июн 13, 10:51    [14404494]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Glory
Lily V.
Выдает результат, что это:
DEFAULT_CONSTRAINT

Приведите лучше скрипт создания вашей таблицы сгенерированный студией


/****** Object:  Table [dbo].[ToolsStoragePostingSpec]    Script Date: 06/07/2013 12:34:12 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ToolsStoragePostingSpec]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[ToolsStoragePostingSpec](
	[ToolsSPSpecID] [dbo].[type_id] IDENTITY(1,1) NOT NULL,
	[ToolsSPID] [numeric](10, 0) NULL,
	[TmID] [dbo].[type_id] NULL,
	[ToolNum] [int] NULL,
	[ToolDate] [date] NULL,
	[UseDate] [date] NULL,
	[Kol] [numeric](10, 0) NULL,
	[TmcpID] [numeric](10, 0) NULL,
 CONSTRAINT [PK_ToolsStoragePostingSpec] PRIMARY KEY CLUSTERED 
(
	[ToolsSPSpecID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [UniqueToolNumber] UNIQUE NONCLUSTERED 
(
	[ToolNum] ASC,
	[ToolDate] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ToolsSP_TmID]') AND parent_object_id = OBJECT_ID(N'[dbo].[ToolsStoragePostingSpec]'))
ALTER TABLE [dbo].[ToolsStoragePostingSpec]  WITH CHECK ADD  CONSTRAINT [FK_ToolsSP_TmID] FOREIGN KEY([TmID])
REFERENCES [dbo].[sptm] ([tmid])
GO

IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ToolsSP_TmID]') AND parent_object_id = OBJECT_ID(N'[dbo].[ToolsStoragePostingSpec]'))
ALTER TABLE [dbo].[ToolsStoragePostingSpec] CHECK CONSTRAINT [FK_ToolsSP_TmID]
GO

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF__ToolsStorag__Kol__1CD715DA]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[ToolsStoragePostingSpec] ADD  DEFAULT ((1)) FOR [Kol]
END

GO

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF__ToolsStor__TmcpI__1DCB3A13]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[ToolsStoragePostingSpec] ADD  DEFAULT (NULL) FOR [TmcpID]
END

GO
7 июн 13, 10:53    [14404512]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
[ToolsSPID] [numeric](10, 0) NULL - здесь нет никакого пользовательского типа данных
Он есть здесь - [TmID] [dbo].[type_id] NULL

Какой столбец вы все таки пытаетесь удалить ?
7 июн 13, 10:58    [14404565]     Ответить | Цитировать Сообщить модератору
 Re: Определить связи полей таблицы  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Glory
[ToolsSPID] [numeric](10, 0) NULL - здесь нет никакого пользовательского типа данных
Он есть здесь - [TmID] [dbo].[type_id] NULL

Какой столбец вы все таки пытаетесь удалить ?


Пытаюсь удалить ToolsSPID, перед этим уже попробовала поменять тип поля из значение по умолчанию:
ALTER TABLE dbo.ToolsStoragePostingSpec ALTER COLUMN ToolsSPID NUMERIC(10, 0) NULL
Поэтому в сгенерированном скрипте у этого поля другой тип. Но даже после этого его удалить не удается по той же причине
7 июн 13, 11:02    [14404612]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить