Часто задаваемые вопросы о запросах к системному каталогу сервера SQL Server
Изменения: 17 июля 2006 г.
Данный раздел содержит список часто задаваемых вопросов. Ответы на эти вопросы — запросы, основанные на представлениях каталога.
Часто задаваемые вопросы
Следующие разделы содержат часто задаваемые вопросы по категориям.
Типы данных
- Как определить типы данных столбцов указанной таблицы?
- Как определить типы данных LOB указанной таблицы?
- Как определить столбцы, зависящие от указанного типа данных?
- Как определить вычисляемые столбцы, зависящие от указанного, определяемого пользователем типа данных CLR или псевдонима типа данных?
- Как определить параметры, зависящие от указанного, определяемого пользователем типа данных CLR или псевдонима типа данных?
- Как определить ограничения CHECK, зависящие от указанного, определяемого пользователем типа данных CLR?
- Как определить представления, функции Transact-SQL и хранимые процедуры Transact-SQL, зависящие от указанного, определяемого пользователем типа данных CLR или псевдонима типа данных?
Таблицы, индексы и ограничения
- Как найти все определяемые пользователем таблицы в базе данных?
- Как найти все таблицы, по которым нет кластеризованного индекса в указанной базе данных?
- Как найти все таблицы, у которых нет никакого индекса?
- Как найти все таблицы, у которых нет первичного ключа?
- Как найти все таблицы, у которых нет никакого столбца идентификаторов?
- Как найти все таблицы и индексы, которые секционированы?
- Как найти все представления в базе данных?
- Как найти все сущности, измененные за последние N дней?
- Как найти столбцы первичного ключа указанной таблицы?
- Как найти столбцы внешнего ключа указанной таблицы?
- Как определить, что столбец используется в выражении вычисляемого столбца?
- Как определить все столбцы, используемые в выражении вычисляемого столбца?
- Как найти все ограничения определенной таблицы?
- Как найти все индексы определенной таблицы?
- Как найти все таблицы с определенным названием столбца?
- Как найти все статистические данные определенного объекта?
- Как найти все статистические данные и статистические столбцы определенного объекта?
Модули (хранимые процедуры, пользовательские функции и триггеры)
- Как найти все хранимые процедуры в базе данных?
- Как найти все определяемые пользователем функции в базе данных?
- Как определить параметры указанной хранимой процедуры или функции?
- Как найти зависимости указанной функции?
- Как просмотреть определение модуля?
- Как просмотреть определение триггера уровня сервера?
Схемы, пользователи, роли и разрешения
- Как найти всех владельцев сущностей, принадлежащих определенной схеме?
- Как определить разрешения, предоставленные или запрещенные для указанного участника?
Ответы
Как найти все таблицы, по которым нет кластеризованного индекса в указанной базе данных?
Перед запуском следующих запросов замените <database_name>
действительным именем базы данных.
USE <database_name>;
GO
SELECT SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name
FROM sys.tables AS t
WHERE NOT EXISTS
(
SELECT * FROM sys.indexes AS i
WHERE i.object_id = t.object_id
AND i.type = 1 -- or type_desc = 'CLUSTERED'
)
ORDER BY schema_name, table_name;
GO
Кроме того, можно использовать функцию OBJECTPROPERTY
, как показано в следующем примере.
USE <database_name>;
GO
SELECT SCHEMA_NAME(schema_id) AS schema_name, name AS table_name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'TableHasClustIndex') = 0
ORDER BY schema_id, name;
GO
В НАЧАЛО
Как найти всех владельцев сущностей, принадлежащих определенной схеме?
Перед запуском следующего запроса замените <database_name>
и <schema_name>
действительными именами.
USE <database_name>;
GO
SELECT 'OBJECT' AS entity_type
,USER_NAME(OBJECTPROPERTY(object_id, 'OwnerId')) AS owner_name
,name
FROM sys.objects WHERE SCHEMA_NAME(schema_id) = '<schema_name>'
UNION
SELECT 'TYPE' AS entity_type
,USER_NAME(TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'OwnerId')) AS owner_name
,name
FROM sys.types WHERE SCHEMA_NAME(schema_id) = '<schema_name>'
UNION
SELECT 'XML SCHEMA COLLECTION' AS entity_type
,COALESCE(USER_NAME(xsc.principal_id),USER_NAME(s.principal_id)) AS owner_name
,xsc.name
FROM sys.xml_schema_collections AS xsc JOIN sys.schemas AS s
ON s.schema_id = xsc.schema_id
WHERE s.name = '<schema_name>';
GO
В НАЧАЛО
Как найти все таблицы, у которых нет первичного ключа?
Перед запуском следующих запросов замените <database_name>
действительным именем базы данных.
USE <database_name>;
GO
SELECT SCHEMA_NAME(t.schema_id) AS schema_name
,t.name AS table_name
FROM sys.tables t
WHERE object_id NOT IN
(
SELECT parent_object_id
FROM sys.key_constraints
WHERE type_desc = 'PRIMARY_KEY_CONSTRAINT' -- or type = 'PK'
);
GO
Кроме того, можно выполнить следующий запрос.
USE <database_name>;
GO
SELECT SCHEMA_NAME(schema_id) AS schema_name
,name AS table_name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'TableHasPrimaryKey') = 0
ORDER BY schema_name, table_name;
GO
В НАЧАЛО
Как найти все таблицы, у которых нет никакого индекса?
Перед запуском следующего запроса замените <database_name>
действительным именем базы данных.
USE <database_name>;
GO
SELECT SCHEMA_NAME(schema_id) AS schema_name
,name AS table_name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0
ORDER BY schema_name, table_name;
GO
В НАЧАЛО
Как найти все таблицы, у которых нет никакого столбца идентификаторов?
Перед запуском следующего запроса замените <database_name>
действительным именем базы данных.
USE <database_name>;
GO
SELECT SCHEMA_NAME(schema_id) AS schema_name
, t.name AS table_name
, c.name AS column_name
FROM sys.tables AS t
JOIN sys.identity_columns c ON t.object_id = c.object_id
ORDER BY schema_name, table_name;
GO
Кроме того, можно выполнить следующий запрос.
Примечание. |
---|
Этот запрос не возвращает имена столбцов. |
USE <database_name>;
GO
SELECT SCHEMA_NAME(schema_id) AS schema_name
,name AS table_name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'TableHasIdentity') = 1
ORDER BY schema_name, table_name;
GO
В НАЧАЛО
Как определить типы данных столбцов указанной таблицы?
Перед запуском следующего запроса замените <database_name>
и <schema_name.table_name>
действительными именами.
USE <database_name>;
GO
SELECT c.name AS column_name
,c.column_id
,SCHEMA_NAME(t.schema_id) AS type_schema
,t.name AS type_name
,t.is_user_defined
,t.is_assembly_type
,c.max_length
,c.precision
,c.scale
FROM sys.columns AS c
JOIN sys.types AS t ON c.user_type_id=t.user_type_id
WHERE c.object_id = OBJECT_ID('<schema_name.table_name>')
ORDER BY c.column_id;
GO
В НАЧАЛО
Как найти зависимости указанной функции?
Перед запуском следующего запроса замените <database_name>
и <schema_name.function_name>
действительными именами.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) AS referencing_object_name
,COALESCE(COL_NAME(object_id, column_id), '(n/a)') AS referencing_column_name
,*
FROM sys.sql_dependencies
WHERE referenced_major_id = OBJECT_ID('<schema_name.function_name>')
ORDER BY OBJECT_NAME(object_id), COL_NAME(object_id, column_id);
GO
В НАЧАЛО
Как найти все хранимые процедуры в базе данных?
Перед запуском следующего запроса замените <database_name>
действительным именем.
USE <database_name>;
GO
SELECT name AS procedure_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,create_date
,modify_date
FROM sys.procedures;
GO
В НАЧАЛО
Как определить параметры указанной хранимой процедуры или функции?
Перед запуском следующего запроса замените <database_name>
и <schema_name.object_name>
действительными именами.
USE <database_name>;
GO
SELECT SCHEMA_NAME(schema_id) AS schema_name
,o.name AS object_name
,o.type_desc
,p.parameter_id
,p.name AS parameter_name
,TYPE_NAME(p.user_type_id) AS parameter_type
,p.max_length
,p.precision
,p.scale
,p.is_output
FROM sys.objects AS o
INNER JOIN sys.parameters AS p ON o.object_id = p.object_id
WHERE o.object_id = OBJECT_ID('<schema_name.object_name>')
ORDER BY schema_name, o.object_name, p.parameter_id;
GO
В НАЧАЛО
Как найти все определяемые пользователем функции в базе данных?
Перед запуском следующего запроса замените <database_name>
действительным именем базы данных.
USE <database_name>;
GO
SELECT name AS function_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,create_date
,modify_date
FROM sys.objects
WHERE type_desc LIKE '%FUNCTION%';
GO
В НАЧАЛО
Как найти все представления в базе данных?
Перед запуском следующего запроса замените <database_name>
действительным именем базы данных.
USE <database_name>;
GO
SELECT name AS view_name
,SCHEMA_NAME(schema_id) AS schema_name
,OBJECTPROPERTYEX(object_id,'IsIndexed') AS IsIndexed
,OBJECTPROPERTYEX(object_id,'IsIndexable') AS IsIndexable
,create_date
,modify_date
FROM sys.views;
GO
В НАЧАЛО
Как найти все сущности, измененные за последние N дней?
Перед запуском следующего запроса замените <database_name>
и <n_days>
действительными значениями.
USE <database_name>;
GO
SELECT name AS object_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,create_date
,modify_date
FROM sys.objects
WHERE modify_date > GETDATE() - <n_days>
ORDER BY modify_date;
GO
В НАЧАЛО
Как определить типы данных LOB указанной таблицы?
Перед запуском следующего запроса замените <database_name>
и <schema_name.table_name>
действительными именами.
USE <database_name>;
GO
SELECT name AS column_name
,column_id
,TYPE_NAME(user_type_id) AS type_name
,max_length
,CASE
WHEN max_length = -1 AND TYPE_NAME(user_type_id) <> 'xml'
THEN 1
ELSE 0
END AS [(max)]
FROM sys.columns
WHERE object_id=OBJECT_ID('<schema_name.table_name>')
AND ( TYPE_NAME(user_type_id) IN ('xml','text', 'ntext','image')
OR (TYPE_NAME(user_type_id) IN ('varchar','nvarchar','varbinary')
AND max_length = -1)
);
GO
В НАЧАЛО
Как просмотреть определение модуля?
Перед запуском следующего запроса замените <database_name>
и <schema_name.object_name>
действительными именами.
USE <database_name>;
GO
SELECT definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('<schema_name.object_name>');
GO
Кроме того, можно использовать функцию OBJECT
_DEFINITION
, как показано в следующем примере.
USE <database_name>;
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('<schema_name.object_name>')) AS ObjectDefinition;
GO
В НАЧАЛО
Как просмотреть определение триггера уровня сервера?
SELECT definition
FROM sys.server_sql_modules;
GO
В НАЧАЛО
Как найти столбцы первичного ключа указанной таблицы?
Перед запуском следующего запроса замените <database_name>
и <schema_name.table_name>
действительными именами.
USE <database_name>;
GO
SELECT i.name AS index_name
,ic.index_column_id
,key_ordinal
,c.name AS column_name
,TYPE_NAME(c.user_type_id)AS column_type
,is_identity
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns AS c
ON ic.object_id = c.object_id AND c.column_id = ic.column_id
WHERE i.is_primary_key = 1
AND i.object_id = OBJECT_ID('<schema_name.table_name>');
GO
Кроме того, можно использовать функцию COL_NAME
, как показано в следующем примере.
USE <database_name>;
GO
SELECT i.name AS index_name
,COL_NAME(ic.object_id,ic.column_id) AS column_name
,ic.index_column_id
,key_ordinal
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1
AND i.object_id = OBJECT_ID('<schema_name.table_name>');
GO
В НАЧАЛО
Как найти столбцы внешнего ключа указанной таблицы?
Перед запуском следующего запроса замените <database_name>
и <schema_name.table_name>
действительными именами.
USE <database_name>;
GO
SELECT
f.name AS foreign_key_name
,OBJECT_NAME(f.parent_object_id) AS table_name
,COL_NAME(fc.parent_object_id, fc.parent_column_id) AS constraint_column_name
,OBJECT_NAME (f.referenced_object_id) AS referenced_object
,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS referenced_column_name
,is_disabled
,delete_referential_action_desc
,update_referential_action_desc
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.object_id = fc.constraint_object_id
WHERE f.parent_object_id = OBJECT_ID('<schema_name.table_name>');
В НАЧАЛО
Как определить разрешения, предоставленные или запрещенные для указанного участника?
В следующем примере создается функция, возвращающая имя сущности, для которой проверяются разрешения. Эта функция вызывается в следующих ниже запросах. Эту функцию нужно создать в каждой базе данных, в которой проверяются разрешения.
-- Create a function to return the name of the entity on which the permissions are checked.
IF OBJECT_ID (N'dbo.entity_instance_name', N'FN') IS NOT NULL
DROP FUNCTION dbo.entity_instance_name;
GO
CREATE FUNCTION dbo.entity_instance_name(@class_desc nvarchar(60), @major_id int)
RETURNS sysname AS
BEGIN
DECLARE @the_entity_name sysname
SELECT @the_entity_name = CASE
WHEN @class_desc = 'DATABASE' THEN DB_NAME()
WHEN @class_desc = 'SCHEMA' THEN SCHEMA_NAME(@major_id)
WHEN @class_desc = 'OBJECT_OR_COLUMN' THEN OBJECT_NAME(@major_id)
WHEN @class_desc = 'DATABASE_PRINCIPAL' THEN USER_NAME(@major_id)
WHEN @class_desc = 'ASSEMBLY' THEN
(SELECT name FROM sys.assemblies WHERE assembly_id=@major_id)
WHEN @class_desc = 'TYPE' THEN TYPE_NAME(@major_id)
WHEN @class_desc = 'XML_SCHEMA_COLLECTION' THEN
(SELECT name FROM sys.xml_schema_collections
WHERE xml_collection_id=@major_id)
WHEN @class_desc = 'MESSAGE_TYPE' THEN
(SELECT name FROM sys.service_message_types WHERE message_type_id=@major_id)
WHEN @class_desc = 'SERVICE_CONTRACT' THEN
(SELECT name FROM sys.service_contracts
WHERE service_contract_id=@major_id)
WHEN @class_desc = 'SERVICE' THEN
(SELECT name FROM sys.services WHERE service_id=@major_id)
WHEN @class_desc = 'REMOTE_SERVICE_BINDING' THEN
(SELECT name FROM sys.remote_service_bindings
WHERE remote_service_binding_id=@major_id)
WHEN @class_desc = 'ROUTE' THEN
(SELECT name FROM sys.routes WHERE route_id=@major_id)
WHEN @class_desc = 'FULLTEXT_CATALOG' THEN
(SELECT name FROM sys.fulltext_catalogs WHERE fulltext_catalog_id=@major_id)
WHEN @class_desc = 'SYMMETRIC_KEY' THEN
(SELECT name FROM sys.symmetric_keys WHERE symmetric_key_id=@major_id)
WHEN @class_desc = 'CERTIFICATE' THEN
(SELECT name FROM sys.certificates WHERE certificate_id=@major_id)
WHEN @class_desc = 'ASYMMETRIC_KEY' THEN
(SELECT name FROM sys.asymmetric_keys WHERE asymmetric_key_id=@major_id)
WHEN @class_desc = 'SERVER' THEN
(SELECT name FROM sys.servers WHERE server_id=@major_id)
WHEN @class_desc = 'SERVER_PRINCIPAL' THEN SUSER_NAME(@major_id)
WHEN @class_desc = 'ENDPOINT' THEN
(SELECT name FROM sys.endpoints WHERE endpoint_id=@major_id)
ELSE '?'
END
RETURN @the_entity_name
END;
GO
-- Return server-level permissions for the user.
SELECT class
,class_desc
,dbo.entity_instance_name(class_desc, major_id) AS entity_name
,minor_id
,SUSER_NAME(grantee_principal_id) AS grantee
,SUSER_NAME(grantor_principal_id) AS grantor
,type
,permission_name
,state_desc
FROM sys.server_permissions
WHERE grantee_principal_id = SUSER_ID('public');
GO
-- Return database-level permissions for the user.
SELECT class
,class_desc
,dbo.entity_instance_name(class_desc , major_id) AS entity_name
,minor_id
,USER_NAME(grantee_principal_id) AS grantee
,USER_NAME(grantor_principal_id) AS grantor
,type
,permission_name
,state_desc
FROM sys.database_permissions
WHERE grantee_principal_id = DATABASE_PRINCIPAL_ID('public');
GO
В НАЧАЛО
Как определить, что столбец используется в выражении вычисляемого столбца?
Перед запуском следующего запроса замените <database_name>
, <schema_name.table_name>
и <column_name
> действительными именами.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) AS object_name
,COL_NAME(object_id, column_id) AS computed_column
,class_desc
,is_selected
,is_updated
,is_select_all
FROM sys.sql_dependencies
WHERE referenced_major_id = OBJECT_ID('<schema_name.table_name>')
AND referenced_minor_id = COLUMNPROPERTY(referenced_major_id, '<column_name>', 'ColumnId')
AND class = 1;
GO
В НАЧАЛО
Как определить все столбцы, используемые в выражении вычисляемого столбца?
Перед запуском следующего запроса замените <database_name>
действительным именем.
USE <database_name>;
GO
SELECT OBJECT_NAME(d.referenced_major_id) AS object_name
,COL_NAME(d.referenced_major_id, d.referenced_minor_id) AS column_name
,OBJECT_NAME(referenced_major_id) AS dependent_object_name
,COL_NAME(d.object_id, d.column_id) AS dependent_computed_column
,cc.definition AS computed_column_definition
FROM sys.sql_dependencies AS d
JOIN sys.computed_columns AS cc
ON cc.object_id = d.object_id AND cc.column_id = d.column_id AND d.object_id=d.referenced_major_id
WHERE d.class = 1
ORDER BY object_name, column_name;
GO
В НАЧАЛО
Как определить столбцы, зависящие от указанного, определяемого пользователем типа данных CLR или псевдонима типа данных?
Перед запуском следующего запроса замените <database_name>
действительным именем и <schema_name.data
_type
_name>
действительным, определяемым пользователем типом CLR с квалификатором схемы либо именем типа alias с квалификатором схемы. В следующем запросе необходимо членство в роли db_owner или разрешения на просмотр всех зависимых столбцов и метаданных вычисляемых столбцов в базе данных.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) AS object_name
,c.name AS column_name
,SCHEMA_NAME(t.schema_id) AS schema_name
,TYPE_NAME(c.user_type_id) AS user_type_name
,c.max_length
,c.precision
,c.scale
,c.is_nullable
,c.is_computed
FROM sys.columns AS c
INNER JOIN sys.types AS t ON c.user_type_id = t.user_type_id
WHERE c.user_type_id = TYPE_ID('<schema_name.data_type_name>');
GO
Следующий запрос возвращает ограниченное и узкое представление столбцов, зависящих от определяемого пользователем типа CLR или псевдонима, но набор результатов доступен для просмотра в роли public. Этот запрос следует использовать в том случае, если предоставлены разрешения REFERENCE определяемого пользователем типа данных для других пользователей и отсутствует разрешение на просмотр метаданных объектов, созданных другими пользователями при использовании этого типа.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) AS object_name
,COL_NAME(object_id, column_id) AS column_name
,TYPE_NAME(user_type_id) AS user_type
FROM sys.column_type_usages
WHERE user_type_id = TYPE_ID('<schema_name.data_type_name>');
GO
В НАЧАЛО
Как определить вычисляемые столбцы, зависящие от указанного, определяемого пользователем типа данных CLR или псевдонима типа данных?
Перед запуском следующего запроса замените <database_name>
действительным именем и <schema_name.data_type_name>
действительным, определяемым пользователем типом CLR с квалификатором схемы либо именем типа alias с квалификатором схемы. Дополнительные сведения о зависимостях вычисляемых столбцов см. в разделе Основные сведения о SQL зависимостях.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) AS object_name
,COL_NAME(object_id, column_id) AS column_name
FROM sys.sql_dependencies
WHERE referenced_major_id = TYPE_ID('<schema_name.data_type_name>')
AND class = 2 -- schema-bound references to type
AND OBJECTPROPERTY(object_id, 'IsTable') = 1; -- exclude non-table dependencies
В НАЧАЛО
Как определить параметры, зависящие от указанного, определяемого пользователем типа данных CLR или псевдонима типа данных?
Перед запуском следующего запроса замените <database_name>
действительным именем и <schema
_name.data_type
_name>
действительным, определяемым пользователем типом CLR с квалификатором схемы либо именем типа alias. В следующем запросе необходимо членство в роли db_owner или разрешения на просмотр всех зависимых столбцов и метаданных вычисляемых столбцов в базе данных.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) AS object_name
,NULL AS procedure_number
,name AS param_name
,parameter_id AS param_num
,TYPE_NAME(p.user_TYPE_ID) AS type_name
FROM sys.parameters AS p
WHERE p.user_TYPE_ID = TYPE_ID('<schema_name.data_type_name>')
UNION
SELECT OBJECT_NAME(object_id) AS object_name
,procedure_number
,name AS param_name
,parameter_id AS param_num
,TYPE_NAME(p.user_TYPE_ID) AS type_name
FROM sys.numbered_procedure_parameters AS p
WHERE p.user_TYPE_ID = TYPE_ID('<schema_name.data_type_name>')
ORDER BY object_name, procedure_number, param_num;
GO
Следующий запрос возвращает ограниченное и узкое представление параметров, зависящих от определяемого пользователем типа CLR или псевдонима, но набор результатов доступен для просмотра в роли public. Этот запрос следует использовать в том случае, если представлены разрешения REFERENCE определяемого пользователем типа данных для других пользователей и отсутствует разрешение на просмотр метаданных объектов, созданных другими пользователями при использовании этого типа.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) AS object_name
,parameter_id
,TYPE_NAME(user_type_id) AS type_name
FROM sys.parameter_type_usages
WHERE user_type_id = TYPE_ID('<schema_name.data_type_name>');
GO
В НАЧАЛО
Как определить ограничения CHECK, зависящие от указанного, определяемого пользователем типа данных CLR?
Перед запуском следующего запроса замените <database_name>
действительным именем и <schema
_name.data_type_name>
действительным, определяемым пользователем типом CLR с квалификатором схемы.
USE <database_name>;
GO
SELECT SCHEMA_NAME(o.schema_id) AS schema_name
,OBJECT_NAME(o.parent_object_id) AS table_name
,OBJECT_NAME(o.object_id) AS constraint_name
FROM sys.sql_dependencies AS d
JOIN sys.objects AS o ON o.object_id = d.object_id
WHERE referenced_major_id = TYPE_ID('<schema_name.data_type_name>')
AND class = 2 -- schema-bound references to type
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst') = 1; -- exclude non-CHECK dependencies
GO
В НАЧАЛО
Как определить представления, функции Transact-SQL и хранимые процедуры Transact-SQL, зависящие от указанного, определяемого пользователем типа данных CLR или псевдонима типа данных?
Перед запуском следующего запроса замените <database_name>
действительным именем и <schema_name.data_type_name>
действительным, определяемым пользователем типом CLR с квалификатором схемы либо именем типа alias с квалификатором схемы.
Определяемые в функции или процедуре параметры неявно привязаны к схемам. Таким образом, зависящие от определяемого пользователем типа CLR или псевдонима параметры можно просматривать при помощи представления каталога sys.sql_dependencies. Процедуры и триггеры не привязаны к схеме. Это означает, что зависимости между любыми выражениями, определенными в теле процедуры или триггера или определяемом пользователем типе CLR или типе псевдонима, не обслуживаются. Привязанные к схеме представления и определяемые пользователем функции, имеющие выражения, зависящие от определяемого пользователем типа CLR или типа псевдонима, обслуживаются в представлении sys.sql_dependencies. Зависимости между типами и функциями среды CLR и процедурами среды CLR не обслуживаются.
Следующий запрос возвращает все зависящие от схемы зависимости в представлениях, функциях Transact-SQL и хранимых процедурах Transact-SQL для указанного, определяемого пользователем типа CLR и типа псевдонима.
USE <database_name>;
GO
SELECT SCHEMA_NAME(o.schema_id) AS dependent_object_schema
,OBJECT_NAME(o.object_id) AS dependent_object_name
,o.type_desc AS dependent_object_type
,d.class_desc AS kind_of_dependency
,TYPE_NAME (d.referenced_major_id) AS type_name
FROM sys.sql_dependencies AS d
JOIN sys.objects AS o
ON d.object_id = o.object_id
AND o.type IN ('FN','IF','TF', 'V', 'P')
WHERE d.class = 2 -- dependencies on types
AND d.referenced_major_id = TYPE_ID('<schema_name.data_type_name>')
ORDER BY dependent_object_schema, dependent_object_name;
GO
В НАЧАЛО
Как найти все ограничения определенной таблицы?
Перед запуском следующего запроса замените <database_name>
и <schema_name.table_name>
действительными именами.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id) as constraint_name
,SCHEMA_NAME(schema_id) AS schema_name
,OBJECT_NAME(parent_object_id) AS table_name
,type_desc
,create_date
,modify_date
,is_ms_shipped
,is_published
,is_schema_published
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT'
AND parent_object_id = OBJECT_ID('<schema_name.table_name>');
GO
В НАЧАЛО
Как найти все индексы определенной таблицы?
Перед запуском следующего запроса замените <database_name>
и <schema_name.table_name>
действительными именами.
USE <database_name>;
GO
SELECT i.name AS index_name
,i.type_desc
,is_unique
,ds.type_desc AS filegroup_or_partition_scheme
,ds.name AS filegroup_or_partition_scheme_name
,ignore_dup_key
,is_primary_key
,is_unique_constraint
,fill_factor
,is_padded
,is_disabled
,allow_row_locks
,allow_page_locks
FROM sys.indexes AS i
INNER JOIN sys.data_spaces AS ds ON i.data_space_id = ds.data_space_id
WHERE is_hypothetical = 0 AND i.index_id <> 0
AND i.object_id = OBJECT_ID('<schema_name.table_name>');
GO
В НАЧАЛО
Как найти все объекты с определенным названием столбца?
Перед запуском следующего запроса замените <database_name>
и <column_name>
действительными именами.
USE <database_name>;
GO
SELECT OBJECT_NAME(object_id)
FROM sys.columns
WHERE name = '<column_name>';
GO
Или
USE <database_name>;
GO
SELECT SCHEMA_NAME(o.schema_id) AS schema_name
,o.name AS object_name
,type_desc
FROM sys.objects AS o
INNER JOIN sys.columns AS c ON o.object_id = c.object_id
WHERE c.name = '<column_name>';
GO
В НАЧАЛО
Как найти все определяемые пользователем таблицы в базе данных?
Перед запуском следующего запроса замените <database_name>
действительным именем.
USE <database_name>;
GO
SELECT *
FROM sys.tables;
GO
В НАЧАЛО
Как найти все таблицы и индексы, которые секционированы?
Перед запуском следующего запроса замените <database_name>
действительным именем.
USE <database_name>;
GO
SELECT SCHEMA_NAME(o.schema_id) AS schema_name
,OBJECT_NAME(p.object_id) AS table_name
,i.name AS index_name
,p.partition_number
,rows
FROM sys.partitions AS p
INNER JOIN sys.indexes AS i ON p.object_id = i.object_id AND p.index_id = i.index_id
INNER JOIN sys.partition_schemes ps ON i.data_space_id=ps.data_space_id
INNER JOIN sys.objects AS o ON o.object_id = i.object_id
ORDER BY index_name, partition_number;
GO
В НАЧАЛО
Как найти все статистические данные определенного объекта?
Перед запуском следующего запроса замените <database_name>
действительным именем и <schema_name.object_name>
действительным именем таблицы, индексированного представления или возвращающей табличное значение функции.
USE <database_name>;
GO
SELECT name AS statistics_name
,stats_id
,auto_created
,user_created
,no_recompute
FROM sys.stats
WHERE object_id = OBJECT_ID('<schema_name.object_name>');
GO
В НАЧАЛО
Как найти все статистические данные и статистические столбцы определенного объекта?
Перед запуском следующего запроса замените <database_name>
действительным именем и <schema_name.object_name>
действительным именем таблицы, индексированного представления или возвращающей табличное значение функции.
USE <database_name>;
GO
SELECT s.name AS statistics_name
,c.name AS column_name
,sc.stats_column_id
FROM sys.stats AS s
INNER JOIN sys.stats_columns AS sc
ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id
INNER JOIN sys.columns AS c
ON sc.object_id = c.object_id AND c.column_id = sc.column_id
WHERE s.object_id = OBJECT_ID('<schema_name.object_name>');
GO
В НАЧАЛО
См. также
Задачи
Устранение неполадок, связанных с видимостью метаданных
Основные понятия
Запрос к системному каталогу сервера SQL Server
Основные сведения о SQL зависимостях
Настройка видимости метаданных
Другие ресурсы
Соответствия между системными таблицами SQL Server 2000 и системными представлениями SQL Server 2005
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
17 июля 2006 г. |
|
14 апреля 2006 г. |
|