В SQL Server можете да използвате sp_column_privileges_ex
системна съхранена процедура за връщане на привилегии на колони за колоните от определен свързан сървър.
Можете да посочите отделна колона или да посочите всички колони от дадена база данни, таблица и т.н.
Синтаксис
Синтаксисът е така:
sp_column_privileges_ex [ @table_server = ] 'table_server' [ , [ @table_name = ] 'table_name' ] [ , [ @table_schema = ] 'table_schema' ] [ , [ @table_catalog = ] 'table_catalog' ] [ , [ @column_name = ] 'column_name' ]
@table_server
аргументът е единственият задължителен аргумент. Това е името на свързания сървър, от който искате информацията за таблицата.
Другите аргументи са незадължителни и ги обхващам в следващите примери. За повече информация относно тези аргументи вижте документацията на Microsoft.
Пример 1 – връщане на привилегии за конкретна колона
Следният пример връща привилегии за конкретна колона, в конкретна таблица, от конкретна схема на таблица, в конкретна база данни.
EXEC sp_column_privileges_ex @table_server = 'Homer', @table_name = 'City', @table_schema = 'Dimension', @table_catalog = 'WideWorldImportersDW', @column_name = 'Region';
Резултат:
+----------------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |----------------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------| | WideWorldImportersDW | Dimension | City | Region | dbo | dbo | INSERT | YES | | WideWorldImportersDW | Dimension | City | Region | dbo | dbo | REFERENCES | YES | | WideWorldImportersDW | Dimension | City | Region | dbo | dbo | SELECT | YES | | WideWorldImportersDW | Dimension | City | Region | dbo | dbo | UPDATE | YES | +----------------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
Това може да се изпълни и по следния начин:
EXEC sp_column_privileges_ex 'Homer', 'City', 'Dimension', 'WideWorldImportersDW', 'Region';
Пример 2 – Използване на базата данни по подразбиране
Ако не предоставите @table_catalog
аргумент (за да посочите базата данни), ще се използва базата данни по подразбиране за свързания сървър.
Ако премахна @table_catalog
аргумент от предишния пример:
EXEC sp_column_privileges_ex @table_server = 'Homer', @table_name = 'City', @table_schema = 'Dimension', @column_name = 'Region';
Получавам следния резултат:
(0 rows affected) Time: 0.321s
Това е така, защото WideWorldImportersDW
базата данни не е базата данни по подразбиране за свързания сървър. В този случай, когато създадох свързания сървър, използвах @catalog = 'Music'
за да посочите, че базата данни, наречена Музика, ще бъде базата данни по подразбиране за този свързан сървър.
Така че, ако посоча колона, която се намира в базата данни по подразбиране, ще получа резултати:
EXEC sp_column_privileges_ex @table_server = 'Homer', @table_name = 'Artists', @table_schema = 'dbo', @column_name = 'ArtistId';
Получавам следния резултат:
+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------| | Music | dbo | Artists | ArtistId | dbo | dbo | INSERT | YES | | Music | dbo | Artists | ArtistId | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | ArtistId | dbo | dbo | SELECT | YES | | Music | dbo | Artists | ArtistId | dbo | dbo | UPDATE | YES | +-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
Пример 3 – Посочете само таблица
В този пример указвам само името на таблицата.
EXEC sp_column_privileges_ex @table_server = 'Homer', @table_name = 'Artists';
Резултат:
+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------| | Music | dbo | Artists | ActiveFrom | dbo | dbo | INSERT | YES | | Music | dbo | Artists | ActiveFrom | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | ActiveFrom | dbo | dbo | SELECT | YES | | Music | dbo | Artists | ActiveFrom | dbo | dbo | UPDATE | YES | | Music | dbo | Artists | ArtistId | dbo | dbo | INSERT | YES | | Music | dbo | Artists | ArtistId | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | ArtistId | dbo | dbo | SELECT | YES | | Music | dbo | Artists | ArtistId | dbo | dbo | UPDATE | YES | | Music | dbo | Artists | ArtistName | dbo | dbo | INSERT | YES | | Music | dbo | Artists | ArtistName | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | ArtistName | dbo | dbo | SELECT | YES | | Music | dbo | Artists | ArtistName | dbo | dbo | UPDATE | YES | | Music | dbo | Artists | CountryId | dbo | dbo | INSERT | YES | | Music | dbo | Artists | CountryId | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | CountryId | dbo | dbo | SELECT | YES | | Music | dbo | Artists | CountryId | dbo | dbo | UPDATE | YES | +-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
Това връща привилегиите за всички колони в посочената таблица.
Пример 4 – Посочете само името на колоната
В този пример посочвам само името на колоната (също и сървъра, очевидно).
EXEC sp_column_privileges_ex @table_server = 'Homer', @column_name = 'ArtistName';
Резултати:
+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------| | Music | dbo | Artists | ArtistName | dbo | dbo | INSERT | YES | | Music | dbo | Artists | ArtistName | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | ArtistName | dbo | dbo | SELECT | YES | | Music | dbo | Artists | ArtistName | dbo | dbo | UPDATE | YES | | Music | dbo | BluesAlbums | ArtistName | dbo | dbo | INSERT | YES | | Music | dbo | BluesAlbums | ArtistName | dbo | dbo | REFERENCES | YES | | Music | dbo | BluesAlbums | ArtistName | dbo | dbo | SELECT | YES | | Music | dbo | BluesAlbums | ArtistName | dbo | dbo | UPDATE | YES | | Music | dbo | JazzAlbums | ArtistName | dbo | dbo | INSERT | YES | | Music | dbo | JazzAlbums | ArtistName | dbo | dbo | REFERENCES | YES | | Music | dbo | JazzAlbums | ArtistName | dbo | dbo | SELECT | YES | | Music | dbo | JazzAlbums | ArtistName | dbo | dbo | UPDATE | YES | | Music | dbo | RockAlbums | ArtistName | dbo | dbo | INSERT | YES | | Music | dbo | RockAlbums | ArtistName | dbo | dbo | REFERENCES | YES | | Music | dbo | RockAlbums | ArtistName | dbo | dbo | SELECT | YES | | Music | dbo | RockAlbums | ArtistName | dbo | dbo | UPDATE | YES | +-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
Това върна привилегии за още три колони. Те са от три различни изгледа (базата данни има три изгледа с ArtistName
колона:BluesAlbums
, JazzAlbums
и RockAlbums
).
Пример 5 – Посочете само свързания сървър (без други аргументи)
Тук посочвам само свързания сървър - не предоставям никакви други аргументи. В този случай той ще върне всички привилегии за всички колони в базата данни:
EXEC sp_column_privileges_ex @table_server = 'Homer';
Няма да показвам резултатите тук, защото върна над 26 000 реда. Повечето от тях бяха от sys
схема на таблицата.
Пример 6 – Посочете схема на таблица
Следният пример стеснява резултатите до конкретна схема на таблица (dbo
).
EXEC sp_column_privileges_ex @table_server = 'Homer', @table_schema = 'dbo';
Това върна много по-малък набор от резултати от предишния пример. Все още е доста голям, така че няма да го показвам тук.
Пример 7 – заместващи знаци
Можете също да използвате заместващи знаци. Ето пример за използване на %
заместващ знак:
EXEC sp_column_privileges_ex @table_server = 'Homer', @table_schema = 'dbo', @table_catalog = 'Music', @column_name = 'Ar%';
Това връща привилегии за всички колони, които започват с Ar
.