Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
iSloven
Member

Откуда:
Сообщений: 5
Здравствуйте. Стоит задача - проверить что нет утечки информации между организациями.
Из рессурсов - логгер, который собирает запросы в табличку в виде обычных строк.
Восновном запросы стандартного вида SELECT ... FROM ... WHERE ... (см рис.) и прямо или косвенно есть JOIN с таблицей Organization

Как я думал решить эту задачу - заменю выражение SELECT ... на SELECT * и в резалте проверю Organization на допустимые, но не тут-то было.
- так как я не знаю схемы, то не могу знать точного имени колонки по которой можно проверить Organization
- колонка Organization может быть в нескольких заджойненных таблицах и тут вылазит Ambiguity
- пытался сделать с openrowset:
-- динамический запрос внутри курсора (упрощён)
SELECT * INTO #TempResults FROM OPENROWSET('SQLOLEDB', 'Server=.;Trusted_Connection=yes;','+@query+')
-- опять проблема с ambiguity


Блин, даже в XML выгрузить нельзя - иногда попадаются CLR типы.

скрин таблицы логов:Картинка с другого сайта.

Я уже не знаю что делать, как к этой задаче подойти.
Может есть какая-то возможность построить SELECT *.organization,
или может кто-то знает как подругому можно получить схему резалтсета
или, что ещё лучше, кто-то предложит другой вариант проверки данных.
19 мар 13, 19:31    [14069378]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iSloven
Стоит задача - проверить что нет утечки информации между организациями.

Озвучьте критерии, согласно которым можно понять, есть утечка информации, или её нет.

iSloven
Из рессурсов - логгер, который собирает запросы в табличку в виде обычных строк.

Каким образом логгер это делает? Какие именно запросы собирает?

iSloven
Восновном запросы стандартного вида SELECT ... FROM ... WHERE ... (см рис.)

Смотреть рисунок весьма затруднительно, лупа не помогла, микроскоп в ремонте.

iSloven
колонка Organization может быть в нескольких заджойненных таблицах и тут вылазит Ambiguity

Сервер так и пишет:
Msg 9999, Level 16, State 1, Line 1
Вылезло Ambiguity!
, или вы всё-таки можете привести текст запроса и точный текст ошибки?

iSloven
Может есть какая-то возможность построить SELECT *.organization

Что вы подразумеваете под "*.organization"?
19 мар 13, 20:02    [14069480]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
Glory
Member

Откуда:
Сообщений: 104760
а зачем INTO #TempResults ?
sqlcmd.exe с выводом в текстовый файл результатов запроса
19 мар 13, 20:04    [14069488]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
hallabud
Member

Откуда: Киев
Сообщений: 245
iSloven,
Ничего не понял из Вашего описания. Organization - это таблица или поле?
iSloven
есть JOIN с таблицей Organization

iSloven
колонка Organization может быть в нескольких заджойненных таблицах

Как этот лог, который выложен связан с понятием "утечка информации"?
19 мар 13, 20:05    [14069490]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
iSloven
Member

Откуда:
Сообщений: 5
Прошу прощение за непонятное объяснение.

В системе (почти все) таблицы представлены в такой схеме
CREATE TABLE [dbo].[Organization](
	[Organization] [int] IDENTITY(1,1) NOT NULL,
        ...

CREATE TABLE [dbo].[Office](
	[Office] [int] IDENTITY(1,1) NOT NULL,
        ...

Т.е. PK таблицы совпадает с её именем, поэтому Organization это и поле и таблица.

Данные, которые приходят пользователю обычно получаются из иерархии
SELECT ResultForGrid.f1, ResultForGrid.f2, ...
FROM ResultForGrid
JOIN Office
JOIN Organization


Т.е. (Organization) 1->many (Office) 1-> many (ResultForGrid)

гость333
Озвучьте критерии, согласно которым можно понять, есть утечка информации, или её нет.

Если результат SELECTa который пришёл к пользователю содержит информацию которая "принадлежит" другой Organization - то это утечка.

гость333
Каким образом логгер это делает? Какие именно запросы собирает?

Речь идёт о Web-приложении , логер сидит в middle-tier, собирает все запросы которые идут к базе (aka profiler)

Сервер так и пишет:
Msg 9999, Level 16, State 1, Line 1
Вылезло Ambiguity!

дословно так -
Msg 492, Level 16, State 1, Line 9
Duplicate column names are not allowed in result sets obtained through OPENQUERY and OPENROWSET. The column name "WareHouse" is a duplicate.



Что вы подразумеваете под "*.organization"?

Мне нужно (согласно моей задумке) простроить запрос вроде
SELECT UnknownTable1.Organization FROM <тут from часть которую я возьму из лога> WHERE <тут where часть которую я возьму из лога>

Проблема в том, что я не знаю какие таблицы во FROM (вернее их наверно можно отпарсить из from части, но это трудно), соответственно не могу построить нормальный SELECT, чтоб проверить, какие организации использованы в этом запросе

Картинка с другого сайта.
19 мар 13, 23:57    [14070040]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
iSloven
Member

Откуда:
Сообщений: 5
Glory,
OPENROWSET - для того чтоб запрос вида SELEC * FROM <SomeTables> засунуть во временную таблицу, чтоб потом заюзать sp_columns на этой временной таблице, и узнать имена колонок резалтсета. Узнав имена колонок я смогу (думаю что смогу) сделать запрос вида SELECT ParticularTable.Organization FROM <SomeTables> WHERE ParticularTable.Organization != [определённой организации]

Сделав вывод в текстовый файл - что я получу ? - голый текст, который и смогу только что регулярными выражениями прочёсывать. Как из текста определить, что есть какая-то организвция, которой быть не должно?

Тут я конечно пробывал слить всё в XML, но не тут-то было. Опять ambiguity :) не даёт
20 мар 13, 00:06    [14070062]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
Glory
Member

Откуда:
Сообщений: 104760
iSloven
Узнав имена колонок я смогу (думаю что смогу) сделать запрос вида SELECT ParticularTable.Organization FROM <SomeTables> WHERE ParticularTable.Organization != [определённой организации]

Что сейчас мешает выполнить этот запрос и просто обработать ошибку в случае некорректного запроса ?
20 мар 13, 00:40    [14070162]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
iSloven
Member

Откуда:
Сообщений: 5
Glory,
Посмотрите на колонку Message в скрине выше. Все запросы разные, я даже не могу со 100% уверенностью сказать есть ли в каждом конкретном запросе колонка Organization, она скорее всего есть, но мало-ли. Что если где-то встретится RIGHT JOIN или вложенный SELECT.

Я не могу выполнить запрос SELECT ParticularTable.Organization FROM <SomeTables> WHERE ParticularTable.Organization != [определённой организации] - потому что не знаю ParticularTable. Для того чтоб это выяснить я и заморочился с OPENROWSET, но там тупик.

Запрос каждый раз разный, каким-то образом в FROM фигурирует Organization. Может где-то есть JOIN c таблицей Organization, а может одна из таблиц имеет FK Organization, по которому всё фильтруется.
20 мар 13, 01:42    [14070245]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
Glory
Member

Откуда:
Сообщений: 104760
iSloven
Я не могу выполнить запрос SELECT ParticularTable.Organization FROM <SomeTables> WHERE ParticularTable.Organization != [определённой организации] - потому что не знаю ParticularTable

Выполнить вы можете.
И если запрос завершится ошибкой, то это и будет означать, что условие "есть какая-то организвция, которой быть не должно" не выполняется
20 мар 13, 10:27    [14070897]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iSloven,

Какая-то странная у вас ситуация. Может, лучше заняться настройкой безопасности, чем поиском неких утечек? Нет утечек сейчас — будут потом, если модель безопасности это позволяет.
20 мар 13, 11:07    [14071112]     Ответить | Цитировать Сообщить модератору
 Re: Анализ схемы запроса вида SELECT * FROM t1 JOIN t2 JOIN t3 tt ... JOIN tn  [new]
iSloven
Member

Откуда:
Сообщений: 5
Glory,
iSloven
Я не могу выполнить запрос SELECT ParticularTable.Organization FROM <SomeTables> WHERE ParticularTable.Organization != [определённой организации] - потому что не знаю ParticularTable

Выполнить вы можете.
И если запрос завершится ошибкой, то это и будет означать, что условие "есть какая-то организвция, которой быть не должно" не выполняется


Ну если вы считаете это возможным, предположите тогда, какую таблицу я должен подставить вместо ParticularTable.
Ещё раз повторюсь FROM всегда разный, могут быть алиасы, колонка Organization может встетится в нескольких заджойненых таблицах. Здесь слово "ParticularTable" имеет переменное значение. (тоже самое что SELECT *.Organization FROM <SomeTables> WHERE *.Organization != [определённой организации])

Какая-то странная у вас ситуация. Может, лучше заняться настройкой безопасности, чем поиском неких утечек? Нет утечек сейчас — будут потом, если модель безопасности это позволяет.


Это требование заказчика, он сам отчасти принимал участие в разработке фреймворка на котором всё работает, и это требование - "чтоб наверняка проверить". Объяснить ему что-то - нереально. Проще FROM отпарсить.
21 мар 13, 14:34    [14077437]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить