powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как узнать, есть ли колонка PK
11 сообщений из 11, страница 1 из 1
Как узнать, есть ли колонка PK
    #32069811
Green Lord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бьюсь над одной задачей, никак не могу решить - может, кто смодет помочь

собственно, задача:
написать SQL запрос для MS SQL
входные константы: Имя БД, пользователь с привелегиями администратора (как ни странно, на обычном пользовате с доступом к одной БД все работает)
входные данные: имя таблицы, имя колонки
на выходе: это колонка есть PK?

Не получается сделать по одной весьма не очевидной причине:
у пользователя, имеющего доступ только к одной БД, запрос

Код: plaintext
1.
2.
3.
SELECT
*
FROM
	INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 


возвращает 83 записи, в том числе и PK ключи

Тот же заброс у любого администратора для БД пользователя возвращает всего 51 запись - при этот теряя все PK

????
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32069851
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возвращает 83 записи, в том числе и PK ключи
Тот же заброс у любого администратора для БД пользователя возвращает всего 51 запись - при этот теряя все PK


Вы ничего не путаете ? Может вы запускает запрос для разных баз ?
Не могу поверить, что пользователь, входящий в серверную роль System Administrator, вдруг стал получить меньше информации, чем владелец какой-то базы.
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32069862
Green Lord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Увы - я ничего не путаю
Именно так и обстоят дела
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32069864
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не удается смоделировать ситуацию. У меня наоборот пользователь конкретной базы может при обращении к INFORMATION_SCHEMA увидеть меньше данных, чем System Administrator, но никак не наоборот.
SQL2000EE SP2

А у вас "пользователь с привелегиями администратора " отмаплен в базу или нет?
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32069866
Green Lord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что значит -

"пользователь с привелегиями администратора " отмаплен в базу или нет

?

Сначала проблема возникла на пользователе sa - я решил, что проблема в нем. Создал несколько других пользователей с правами администраторов - нет, проблема именно в администраторах


Полностью запрос выглядит так (он возвращает для указанной таблицы информацию об ее колонках):

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
DECLARE @OWNER_NAME VarChar( 30 )
DECLARE @TABLE_NAME VarChar( 30 )

SET @OWNER_NAME = 'user_owner_name'
SET @TABLE_NAME = 'real_table_name'


	SELECT
	[COL_INFO].COLUMN_NAME,
	[COL_INFO].DATA_TYPE,

	COL_LENGTH( @OWNER_NAME + '.' + @TABLE_NAME , [COL_INFO].COLUMN_NAME ) AS [COLUMNLENGTH],
	COLUMNPROPERTY(OBJECT_ID(@OWNER_NAME + '.' + @TABLE_NAME), [COL_INFO].COLUMN_NAME, 'IsIdentity') AS IsIdentity,

	(
	SELECT TOP  1  
		(
		SELECT
			OBJECT_NAME(
					(SELECT
						TOP  1 
						SR.[rkeyid]
					FROM
						[sysreferences] AS SR
					WHERE
						SR.[constid] = OBJECT_ID(CU.[CONSTRAINT_SCHEMA] + '.' + CU.[CONSTRAINT_name])
					)
				)
		)
	
	FROM
		INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS CU
	
	WHERE
		CU.[COLUMN_NAME] = [COL_INFO].COLUMN_NAME AND
		CU.[TABLE_NAME] = @TABLE_NAME
	) AS [FKtoTable],

(
SELECT
TOP  1 
 1 

FROM
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE
	INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ON
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME = INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME

WHERE
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME = @TABLE_NAME AND
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME = [COL_INFO].COLUMN_NAME AND
	INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'PRIMARY KEY'
) AS [isPK]


FROM
	INFORMATION_SCHEMA.COLUMNS AS [COL_INFO]

WHERE
	[COL_INFO].TABLE_NAME = @TABLE_NAME


Но - не работает именно ранее указанная часть:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
TOP  1 
 1 

FROM
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE
	INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ON
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME = INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME

WHERE
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME = @TABLE_NAME AND
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME = [COL_INFO].COLUMN_NAME AND
	INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'PRIMARY KEY'
) AS [isPK]


и не работает именно по указанной причине, и именно на пользователях с администраторскими правами

Я не понимаю, в чем причина - по логике, админ - есть админ, но, но, [isPK] у меня под админами всегда NULL
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32069869
GlebZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А SP у вас системная в master сидит, правильно? Тогда она всё это пытается найти в master DB, независимо от того где вы её ранаете. Попробуйте вот так:
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
ALTER PROC sp_GetTableInfo( @OWNER_NAME VarChar( 30 ), @TABLE_NAME VarChar( 30 ))

AS
DECLARE @DBNAME VARCHAR( 30 )
SET @DBNAME =  DB_NAME()

DECLARE @SQL VARCHAR( 8000 )
	SELECT @SQL = 'SELECT
	[COL_INFO].COLUMN_NAME,
	[COL_INFO].DATA_TYPE,

	COL_LENGTH('''+ @OWNER_NAME + '.' + @TABLE_NAME + ''', [COL_INFO].COLUMN_NAME ) AS [COLUMNLENGTH],
	COLUMNPROPERTY(OBJECT_ID( '''+@OWNER_NAME + '.' + @TABLE_NAME+'''), [COL_INFO].COLUMN_NAME, ''IsIdentity'') AS IsIdentity,

	(
	SELECT TOP 1 
		(
		SELECT
			OBJECT_NAME(
					(SELECT
						TOP 1
						SR.[rkeyid]
					FROM
						[sysreferences] AS SR
					WHERE
						SR.[constid] = OBJECT_ID(CU.[CONSTRAINT_SCHEMA] + ''.'' + CU.[CONSTRAINT_name])
					)
				)
		)
	
	FROM ' + @DBNAME + '.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS CU
	
	WHERE
		CU.[COLUMN_NAME] = [COL_INFO].COLUMN_NAME AND
		CU.[TABLE_NAME] = ''' + @TABLE_NAME + '''
	) AS [FKtoTable],

(
SELECT
TOP 1
1

FROM ' + @DBNAME + '.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
	INNER JOIN ' + @DBNAME + '.INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON
	KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME

WHERE
	KCU.TABLE_NAME = ''' + @TABLE_NAME + ''' AND
	KCU.COLUMN_NAME = [COL_INFO].COLUMN_NAME AND
	TC.CONSTRAINT_TYPE = ''PRIMARY KEY''
) AS [isPK]


FROM ' + @DBNAME + '.INFORMATION_SCHEMA.COLUMNS AS [COL_INFO]

WHERE
	[COL_INFO].TABLE_NAME = ''' + @TABLE_NAME + ''''

EXEC (@SQL)
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32069973
Green Lord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос (где @DBNAME - сооветствующее значение)

Код: plaintext
1.
2.
3.
SELECT
*
FROM
	@DBNAME.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 


возвращает то же, что и

Код: plaintext
1.
2.
3.
SELECT
*
FROM
	INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 


- 51 запись вместо 83
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32069974
Green Lord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и этот запрос - это не сохраненка, это именно запрос, подаваемый на сервер приложением
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32070596
Green Lord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никто так и не подскажет?
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32070719
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что значит - "пользователь с привелегиями администратора " отмаплен в базу или нет ?
Один и тот же SQL login может отображаться в различные базы как разный user, которому могут быть назначен свой набор прав на объекты.


Запросы
select * from mydatabase..syscolumns
select * from mydatabase..sysobjects
для разных пользователей возвращают одинаковое число записей ?

Есть недокументированная процедура . Можно проанализировать ее код
...
Рейтинг: 0 / 0
Как узнать, есть ли колонка PK
    #32071389
Green Lord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Glory - это не ответ на заданный вопрос, это именно то, что нужно
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как узнать, есть ли колонка PK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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