Вход на сайт
Benutzer v SQL2008 : zapros s sysobjects s "sa" und 'user': comische performance
144
NEW 18.08.09 12:22
Доброго дня!
Проблема с Performance (Adminrights) v SQL2008.
В ранних версиях (2000, 2005) с подобхым запросом нет проблем (время запроса 1 сек):
SELECT name,
[Read] = CAST(CASE WHEN Permissions(OBJECT_ID(name)) & 1 > 0 THEN 1 ELSE 0 END AS BIT),
[Write] = CAST(CASE WHEN (Permissions(OBJECT_ID(name)) & 2)*(Permissions(OBJECT_ID(name)) & 8)*(Permissions(OBJECT_ID(name)) & 16) > 0 THEN 1 ELSE 0 END AS BIT)
FROM sysobjects
WHERE Permissions(OBJECT_ID(name)) IS NOT NULL
в 2008 только с 'sa' идет нормально (быстро). с userom без adminrights запрос на сервере идет бесконечно долго (7 минут).
Кто нибуть знает как обойти проблему в SQL 2008? Есть что то новое с ролями в SQL 2008?
Проблема с Performance (Adminrights) v SQL2008.
В ранних версиях (2000, 2005) с подобхым запросом нет проблем (время запроса 1 сек):
SELECT name,
[Read] = CAST(CASE WHEN Permissions(OBJECT_ID(name)) & 1 > 0 THEN 1 ELSE 0 END AS BIT),
[Write] = CAST(CASE WHEN (Permissions(OBJECT_ID(name)) & 2)*(Permissions(OBJECT_ID(name)) & 8)*(Permissions(OBJECT_ID(name)) & 16) > 0 THEN 1 ELSE 0 END AS BIT)
FROM sysobjects
WHERE Permissions(OBJECT_ID(name)) IS NOT NULL
в 2008 только с 'sa' идет нормально (быстро). с userom без adminrights запрос на сервере идет бесконечно долго (7 минут).
Кто нибуть знает как обойти проблему в SQL 2008? Есть что то новое с ролями в SQL 2008?
24.08.09 17:07
в ответ rimqpp0 18.08.09 12:22
rimqpp0,
1) Системная таблица SQL Server 2000 sysobjects включена в более поздние версии как представление для обеспечения обратной совместимости.
Вместо нее рекомендуется использовать системное представление sys.objects.
2) В SQL Server 2005 и более поздних версиях видимость метаданных в представлениях каталога ограничивается защищаемыми объектами, которыми пользователь владеет или на которые ему были предоставлены разрешения.
3) Для получения метаданных рекомедуется пользоваться представлениями схемы INFORMATION_SCHEMA.
1) Системная таблица SQL Server 2000 sysobjects включена в более поздние версии как представление для обеспечения обратной совместимости.
Вместо нее рекомендуется использовать системное представление sys.objects.
2) В SQL Server 2005 и более поздних версиях видимость метаданных в представлениях каталога ограничивается защищаемыми объектами, которыми пользователь владеет или на которые ему были предоставлены разрешения.
3) Для получения метаданных рекомедуется пользоваться представлениями схемы INFORMATION_SCHEMA.
NEW 31.08.09 11:16
в ответ Nickolaychuk 24.08.09 17:07
я сначала попробовал всевозможые granty useram дать.
grant CONTROL оказался самый "еффективный". но получилась чушь, т.к. дает почти 'sa' привилегии.
потом методом тыков нашел решение через sys.objects. для приведенного выше кода получается так:
ALTER VIEW [dbo].[V_Permissions] AS
SELECT TOP 100 PERCENT
REPLACE(REPLACE(REPLACE(ObjectName,'[dbo].',''),'[',''),']','') AS Name,
--has_perms_by_name(ObjectName, 'OBJECT', 'ANY') AS AnyPermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'SELECT') AS SelectPermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'INSERT') AS InsertPermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'UPDATE') AS UpdatePermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'DELETE') AS DeletePermission,
[Read] = CAST(CASE WHEN has_perms_by_name(ObjectName, 'OBJECT', 'SELECT')& 1 >0 THEN 1 ELSE 0 END AS BIT),
[Write]= CAST(CASE WHEN (has_perms_by_name(ObjectName, 'OBJECT', 'INSERT') & 1)*
(has_perms_by_name(ObjectName, 'OBJECT', 'UPDATE')& 1)*
(has_perms_by_name(ObjectName, 'OBJECT', 'DELETE') & 1) > 0 THEN 1 ELSE 0 END AS BIT)
FROM (SELECT
QUOTENAME(SCHEMA_NAME(schema_id)) + '.'
+ QUOTENAME(OBJECT_NAME(object_id)) AS ObjectName
FROM sys.objects
-- nur Tabellen, Sichten, User-Funktionen und Proceduren
WHERE TYPE IN ('U', 'V', 'P','TF','FN', 'SQ')
) AS o
ORDER BY ObjectName
Но представление об INFORMATION_SCHEMA пока смутное. Moжно в пару предложениях ваше мнение что ето такое?
grant CONTROL оказался самый "еффективный". но получилась чушь, т.к. дает почти 'sa' привилегии.
потом методом тыков нашел решение через sys.objects. для приведенного выше кода получается так:
ALTER VIEW [dbo].[V_Permissions] AS
SELECT TOP 100 PERCENT
REPLACE(REPLACE(REPLACE(ObjectName,'[dbo].',''),'[',''),']','') AS Name,
--has_perms_by_name(ObjectName, 'OBJECT', 'ANY') AS AnyPermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'SELECT') AS SelectPermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'INSERT') AS InsertPermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'UPDATE') AS UpdatePermission,
--has_perms_by_name(ObjectName, 'OBJECT', 'DELETE') AS DeletePermission,
[Read] = CAST(CASE WHEN has_perms_by_name(ObjectName, 'OBJECT', 'SELECT')& 1 >0 THEN 1 ELSE 0 END AS BIT),
[Write]= CAST(CASE WHEN (has_perms_by_name(ObjectName, 'OBJECT', 'INSERT') & 1)*
(has_perms_by_name(ObjectName, 'OBJECT', 'UPDATE')& 1)*
(has_perms_by_name(ObjectName, 'OBJECT', 'DELETE') & 1) > 0 THEN 1 ELSE 0 END AS BIT)
FROM (SELECT
QUOTENAME(SCHEMA_NAME(schema_id)) + '.'
+ QUOTENAME(OBJECT_NAME(object_id)) AS ObjectName
FROM sys.objects
-- nur Tabellen, Sichten, User-Funktionen und Proceduren
WHERE TYPE IN ('U', 'V', 'P','TF','FN', 'SQ')
) AS o
ORDER BY ObjectName
Но представление об INFORMATION_SCHEMA пока смутное. Moжно в пару предложениях ваше мнение что ето такое?
31.08.09 15:48
в ответ rimqpp0 31.08.09 11:16
Alex,
Ну, работающее решение у Вас уже есть :)
То же самое в части таблиц (аналогично, процедуры-функции) можно было получить запросом:
SELECT
ObjectName
, [Read] = CAST(CASE WHEN HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'SELECT')& 1 > 0 THEN 1 ELSE 0 END AS bit)
, [Write]= CAST(CASE WHEN (HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'INSERT') & 1)*
(HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'UPDATE')& 1)*
(HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'DELETE') & 1) > 0 THEN 1 ELSE 0 END AS bit)
FROM (
SELECT
ObjectName = QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
FROM (SELECT *
FROM INFORMATION_SCHEMA.TABLES
--UNION ALL
) o
) o
Ну, работающее решение у Вас уже есть :)
То же самое в части таблиц (аналогично, процедуры-функции) можно было получить запросом:
SELECT
ObjectName
, [Read] = CAST(CASE WHEN HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'SELECT')& 1 > 0 THEN 1 ELSE 0 END AS bit)
, [Write]= CAST(CASE WHEN (HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'INSERT') & 1)*
(HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'UPDATE')& 1)*
(HAS_PERMS_BY_NAME(ObjectName, 'OBJECT', 'DELETE') & 1) > 0 THEN 1 ELSE 0 END AS bit)
FROM (
SELECT
ObjectName = QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
FROM (SELECT *
FROM INFORMATION_SCHEMA.TABLES
--UNION ALL
) o
) o