Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Озвучьте критерии, согласно которым можно понять, есть утечка информации, или её нет.
Каким образом логгер это делает? Какие именно запросы собирает?
Смотреть рисунок весьма затруднительно, лупа не помогла, микроскоп в ремонте.
Сервер так и пишет:
Что вы подразумеваете под "*.organization"? |
||||||||||||
19 мар 13, 20:02 [14069480] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
а зачем INTO #TempResults ? sqlcmd.exe с выводом в текстовый файл результатов запроса |
19 мар 13, 20:04 [14069488] Ответить | Цитировать Сообщить модератору |
hallabud Member Откуда: Киев Сообщений: 245 |
iSloven, Ничего не понял из Вашего описания. Organization - это таблица или поле?
Как этот лог, который выложен связан с понятием "утечка информации"? |
||||
19 мар 13, 20:05 [14069490] Ответить | Цитировать Сообщить модератору |
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)
Если результат SELECTa который пришёл к пользователю содержит информацию которая "принадлежит" другой Organization - то это утечка.
Речь идёт о Web-приложении , логер сидит в middle-tier, собирает все запросы которые идут к базе (aka profiler)
Мне нужно (согласно моей задумке) простроить запрос вроде SELECT UnknownTable1.Organization FROM <тут from часть которую я возьму из лога> WHERE <тут where часть которую я возьму из лога> Проблема в том, что я не знаю какие таблицы во FROM (вернее их наверно можно отпарсить из from части, но это трудно), соответственно не могу построить нормальный SELECT, чтоб проверить, какие организации использованы в этом запросе ![]() |
||||||||||
19 мар 13, 23:57 [14070040] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Что сейчас мешает выполнить этот запрос и просто обработать ошибку в случае некорректного запроса ? |
||
20 мар 13, 00:40 [14070162] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Выполнить вы можете. И если запрос завершится ошибкой, то это и будет означать, что условие "есть какая-то организвция, которой быть не должно" не выполняется |
||
20 мар 13, 10:27 [14070897] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
iSloven, Какая-то странная у вас ситуация. Может, лучше заняться настройкой безопасности, чем поиском неких утечек? Нет утечек сейчас — будут потом, если модель безопасности это позволяет. |
20 мар 13, 11:07 [14071112] Ответить | Цитировать Сообщить модератору |
iSloven Member Откуда: Сообщений: 5 |
Glory,
Ну если вы считаете это возможным, предположите тогда, какую таблицу я должен подставить вместо ParticularTable. Ещё раз повторюсь FROM всегда разный, могут быть алиасы, колонка Organization может встетится в нескольких заджойненых таблицах. Здесь слово "ParticularTable" имеет переменное значение. (тоже самое что SELECT *.Organization FROM <SomeTables> WHERE *.Organization != [определённой организации])
Это требование заказчика, он сам отчасти принимал участие в разработке фреймворка на котором всё работает, и это требование - "чтоб наверняка проверить". Объяснить ему что-то - нереально. Проще FROM отпарсить. |
||||||
21 мар 13, 14:34 [14077437] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |