Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Benutzer v SQL2008 : zapros s sysobjects s "sa" und 'user': comische performance

144  
  rimqpp0 гость18.08.09 12:22
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?
#1 
Nickolaychuk прохожий24.08.09 17:07
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.
#2 
  rimqpp0 гость31.08.09 11:16
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жно в пару предложениях ваше мнение что ето такое?
#3 
Nickolaychuk прохожий31.08.09 15:48
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
#4