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

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

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

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


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

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

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


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

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

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

?

Сначала проблема возникла на пользователе 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
19.11.2002, 23:29:42
    #32069869
GlebZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли колонка PK
А 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
20.11.2002, 10:23:52
    #32069973
Green Lord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли колонка PK
Запрос (где @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
20.11.2002, 10:24:55
    #32069974
Green Lord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли колонка PK
Да, и этот запрос - это не сохраненка, это именно запрос, подаваемый на сервер приложением
...
Рейтинг: 0 / 0
21.11.2002, 10:30:27
    #32070596
Green Lord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли колонка PK
Никто так и не подскажет?
...
Рейтинг: 0 / 0
21.11.2002, 13:22:05
    #32070719
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли колонка PK
что значит - "пользователь с привелегиями администратора " отмаплен в базу или нет ?
Один и тот же SQL login может отображаться в различные базы как разный user, которому могут быть назначен свой набор прав на объекты.


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

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


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