Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
Здравствуйте. Возвращаюсь к основам программирования после 10 лет забытия, поэтому прошу не судить строго.
Есть конкретная задача, которую надо решить в оперативном режиме - время на изучение теории нет.
Не хочется изобретать велосипед (тем более задача думаю многим известная) - подскажите, в каком направлении копать.

Есть ПО по архитектуре КЛИЕНТ-СЕРВЕР (C# + MS SQL).
Есть функционал, в котором пользователь просматривает состав какого-либо изделия (часто употребляют термин - "разузлование").
Каждый клиент временно загружает данные об изделии в таблицу состава изделия и уже с ней работает.
Каждый клиент видит только свои данные (свое изделие) и не оказывает влияние на других.
По окончанию сеанса - таблица очищается.

Ранее такой функционал в Oracle реализовывали при помощи временных таблиц - идеально подходили.

Вопрос: как его реализовать в MS SQL.

Возможные варианты, которые я рассматривал и которые мне не подошли. Или я до конца не понял:
1) Табличные переменные. Мне не подходят, так как создаются/очищаются в рамках одной хранимой процедуры. А мне нужно совершать над данными действия из приложения.

2) Временные таблицы. Вроде подходят (как раз хранят данные в рамках сеанса). Но нашел описание, что если создать в рамках хранимой процедуры, то и видны будут из этой процедуры - другие хранимые процедуры (кроме вложенных) не увидят данные. Мне опять же не подходит.

3) Использовать обычную таблицу и ручками управлять данными (очищать, загружать). Но встанет вопрос разграничения видимости данных, чтобы один пользователь "не мешал" другому. Это можно сделать, если добавить в таблицу какой-нибудь идентфикатор пользователя и ориентироваться на него - но как-то это трудозатратно и рискованно.

Подскажите, как лучше реализовать данный функционал ? Не уж то в MS SQL нет средства, чтобы работать с данными в рамках одного сеанса, но при помощи разных хранимых процедур. Например, одна - создала и заполнила таблицу, вторая - отфильтровала нужное, третья - изменила содержимое и т.д.

Спасибо.
25 июл 17, 13:15    [20672894]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Totos,

1. Создавайте таблицы в родительской процедуре.
2. используйте ## временные таблички с уникальной приставкой к названию в виде spid например
25 июл 17, 13:32    [20672974]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Totos
2) Временные таблицы. Вроде подходят (как раз хранят данные в рамках сеанса). Но нашел описание, что если создать в рамках хранимой процедуры, то и видны будут из этой процедуры - другие хранимые процедуры (кроме вложенных) не увидят данные. Мне опять же не подходит.
Если создать в сеансе, то будет видно внутри всех вызовов.

В принципе можно так делать, создавать в клиенте рабочие временные таблицы.

Увы, такого сделать нельзя, что бы создать временную таблицу в процедуре, и она была бы видна в сеансе до удаления или конца сеанса.
25 июл 17, 13:33    [20672976]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Увы, такого сделать нельзя, что бы создать временную таблицу в процедуре, и она была бы видна в сеансе до удаления или конца сеанса.
А зачем ? Создайте неск. ВТ в начале сессии и используйте их имея полную гарантию, что они созданы.

Единств. неудобство ВТ, если сеанс на мгновение прервется (н-р пропала сеть), то все ВТ дропнутся.
25 июл 17, 14:15    [20673142]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
LSV, проясните, пожалуйста, несколько моментов:

1) зачем создавать несколько временных таблиц ? Мне для каждого клиента требуется только одна

2) насколько я понял, мне нужно создать временную таблицу непосредственно передав запрос на создание из клиента, не использую хранимые процедуры. А дальше я могу вызывать различные хранимые процедуры, которые и будут заполнять/изменять данные внутри этой временной таблицы. Я правильно понимаю принципы ?
25 июл 17, 14:23    [20673187]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Сделать постоянную таблицу с системным именем пользователя
и VIEW с ограничением по этому полю (сравнивать с ORIGINAL_LOGIN(), например).
Только не забывать вовремя чистить эту таблицу, например, в триггере на LOGON.
25 июл 17, 14:23    [20673189]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
msLex
Member

Откуда:
Сообщений: 8091
iap
системным именем пользователя

Главное чтобы пользователь дважды не подключился, а "триггере на LOGON." начистит ему
25 июл 17, 14:26    [20673213]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
WarAnt
Totos,

1. Создавайте таблицы в родительской процедуре.
2. используйте ## временные таблички с уникальной приставкой к названию в виде spid например


1. У меня не непрерывный процесс расчетов и/или формирования отчета, а процесс взаимодействия с пользователем - следовательно, родительской хранимой процедуры нет. Есть первая процедуры, которая запускается при открытии формы - дальнейшие вызовы зависят от действия пользователя

2. Если создавать такие таблички, то придется к каждой процедуре добавлять параметр для обращения к нужной таблички и динамически формировать запросы. Как-то слишком сложно.

P.S. Почему-то временные таблицы в MS SQL специалисты более хвалят за функционал, чем Oracle, но в моем случае я не вижу преимуществ (либо они вообще разработаны для разных целей)
25 июл 17, 14:30    [20673246]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
В такой ситуации необходимо загружать на клиента требуемый набор данных и работать с ним локально.
25 июл 17, 14:33    [20673266]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
iap
Сделать постоянную таблицу с системным именем пользователя
и VIEW с ограничением по этому полю (сравнивать с ORIGINAL_LOGIN(), например).
Только не забывать вовремя чистить эту таблицу, например, в триггере на LOGON.


Не могли бы развернуть ответ:
1) Создаю статическую таблицу с фиксированным именем.

2) Добавляю столбец, который идентифицирует данные конкретного пользователя

3) и VIEW с ограничением по этому полю (сравнивать с ORIGINAL_LOGIN(), например) - здесь не очень понял ? Это какое-то параметризированное представление. Не могли бы привести пример или развернуть или подсказать, куда копать (не специалист в MS SQL) ?
25 июл 17, 14:48    [20673347]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Col
Member

Откуда: Торонто
Сообщений: 180
Totos
Не надо ничего городить
Snapshot Isolation Level включите на базе и каждый пользователь будет работать со своим набором данных.
Памяти и места под ТемпДБ только убедитесь что есть достаточно.
25 июл 17, 15:10    [20673483]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
msLex
Member

Откуда:
Сообщений: 8091
Col
Snapshot Isolation Level включите на базе и каждый пользователь будет работать со своим набором данных.


Каким же это образом Snapshot Isolation Level поможет работать "со своим набором данных", если ТС требуется разделение на уровни сессии а не транзакции?
25 июл 17, 15:20    [20673552]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
автор
Snapshot Isolation Level включите на базе и каждый пользователь будет работать со своим набором данных.

тут даже и добавить нечего... так и живё в снапшоте: каждый со своим...
25 июл 17, 15:23    [20673568]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
Totos
насколько я понял, мне нужно создать временную таблицу непосредственно передав запрос на создание из клиента, не использую хранимые процедуры. А дальше я могу вызывать различные хранимые процедуры, которые и будут заполнять/изменять данные внутри этой временной таблицы. Я правильно понимаю принципы ?
Да.

Можете использовать этот вариант, если приложение работает с БД через единственное соединение.
Если у сервера не очень много ресурсов, то при данном способе общее количество одновременно работающих (установивших соединение) пользователей должно быть невелико.
25 июл 17, 15:40    [20673645]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
invm,

А у меня закрались следующие сомнения:
- создаваться временная таблица будет в из клиента на момент открытия формы.
- а хранимые процедуры на изменение данных я хотел разработать заранее.

Вопрос:
Как я буду обращаться к временной таблице, которая не создана в рамках этой хранимой процедуры ?
Мне кажется, что компилятор не допустит
25 июл 17, 15:48    [20673684]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
Кстати, это качается и вложенных хранимых процедур - как вложенные процедуры будут обращаться к временной таблице, если таблица объявлена в родительской (вызывающей) процедуре ?
25 июл 17, 15:50    [20673696]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Totos
invm,

А у меня закрались следующие сомнения:
- создаваться временная таблица будет в из клиента на момент открытия формы.
- а хранимые процедуры на изменение данных я хотел разработать заранее.

Вопрос:
Как я буду обращаться к временной таблице, которая не создана в рамках этой хранимой процедуры ?
Мне кажется, что компилятор не допустит

объекты в процедуре парсятся при первом запуске. engine пропустит практически любой бред. И в принципе распрастранённая практика работы

CREATE TABLE#t ( )
EXEC PROC 1 -- работа с #t
EXEC PROC 2-- работа с #t
SELECT * FROM #t
25 июл 17, 15:51    [20673700]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
Totos
Вопрос:
Как я буду обращаться к временной таблице, которая не создана в рамках этой хранимой процедуры ?
Мне кажется, что компилятор не допустит
Для хранимых процедур действует deferred name resolution.
Если грубо - реально имена разрешаются при компиляции. Создание/редактирование процедуры не есть компиляция.
25 июл 17, 16:00    [20673734]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Вообще, странная манера - "Мне кажется, что компилятор не допустит"
Взять и попробовать в MSSQL Management Studio религия запрещает?
Все вопросы сразу отпадут.
25 июл 17, 16:04    [20673753]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
Запах у такой архитектуры не очень. Следует избегать сильно связанное кодирование.
25 июл 17, 16:08    [20673774]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
iap
Вообще, странная манера - "Мне кажется, что компилятор не допустит"
Взять и попробовать в MSSQL Management Studio религия запрещает?
Все вопросы сразу отпадут.


В любом вопросе можно разобраться самому - вопрос во времени.
В данном случае, время приоритетно и критично - быстрее спросить.
Если Вас это смущает - не отвечайте. Никто не ответит - буду пробовать сам.
Но есть добрые люди на белом свете ...
25 июл 17, 16:11    [20673787]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Totos
Member

Откуда: Калуга
Сообщений: 193
Владислав Колосов,

Вопрос в этом и стоял - как организовать архитектуру с приятным запахом для данной задачи. Подскажите ?

Не думал, что эта задача вызовет так много проблем.

10 лет назад на Oracle её организовали за 10 минут.

Интересно, как работают программы по организации производства на основании MS SQL, где "разузлование" сборок и деталей является основной задачей ?!
25 июл 17, 16:14    [20673807]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Владислав Колосов
Member

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

собственно, чтобы дать какой-то вразумительный ответ, надо понимать - как организована работа клиента с сервером и какие задачи Вы хотите решить организацией "песочницы".
25 июл 17, 16:48    [20673998]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
Мне, например, непонятно - для чего

автор
Каждый клиент временно загружает данные об изделии в таблицу состава изделия и уже с ней работает.
25 июл 17, 16:50    [20674009]     Ответить | Цитировать Сообщить модератору
 Re: Аналог временных таблиц Oracle в MS SQL (видимость только "своих" данных в рамках сеанса)  [new]
Alozar
Member

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

Плевать на вложенность хранимых процедур. Временная таблица создаётся в рамках СЕАНСА, а не процедуры. Если у вас клиент постоянно поддерживает соединение с сервером, можете создать временную таблицу и работать с ней сколько влезет.
25 июл 17, 16:58    [20674048]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить