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

Откуда: Киев
Сообщений: 272
Драсте.
Есть проект. Все хорошо и понятно, но заказчик хочет под MsSQL.
В принципе ничего сложного нет , но у нас возникло несколько вопросов. Все проекты в основном разрабатывались под Oracle. И есть там такая вещь как контексты и сиквенсы.
Смысл их таков что в них можно хранить переменныя для своей сессии. Например при авторизации пользывателя данные о его сессии и коду хранились в контекстах и т.д.
В случае тригерра который срабатывает на измсенение данных он вытаскивал с контекста информацию о полызвателе и ложыл в аудит или что то еще делал.
Можно ли такое сделать в MsSQL и как. Создавать переменные для сесии и работать с ними.

Сиквенсы это простой счетчик, но не для таблицы как в случае IDentity. Аналоги встречали и в фаерберде и других бд, а вот как в MsSQL? Нашел ссылку но как то там много всего надо делать. [url=]http://blogs.gotdotnet.ru/personal/DeColores/PermaLink.aspx?guid=9d5249eb-ad3b-4db5-85ca-03a04d5caa74[/url]
Спасибо.
25 окт 09, 14:29    [7835436]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Есть, конечно, такая штука, как CONTEXT_INFO (Transact-SQL) (см. также SET CONTEXT_INFO (Transact-SQL)).
Но, вообще говоря, непонятно, почему нельзя просто использовать постоянную таблицу (а, может, и временную?!) для хранения параметров?
25 окт 09, 18:01    [7835718]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
iap,

Удобно использывать в случаях когда нужно получить переменную. Не нужно писать доп. выборку а напрямую обращятся к переменной.
В oracle делали так Set_Context(Param_Group, Value).
При авторизации туда сразу ложились определенные параметры(код юзера, набор доп параметров, информация о логине и т.д) и в итоге с ними работали как с обычными переменнами , которые действительны только для текущей сесии.
Если что будем использывать временные таблицы.
Спасибо за наводку.
25 окт 09, 19:04    [7835810]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
iap,

на аналог контекстных переменных не похоже что то...
25 окт 09, 19:16    [7835828]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
iljy
Member

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

ну вообще разновсяческая инфа о юзере доступна через разнообразные системные функции типа SUSER_NAME(), посмотрите - может не надо велосипед изобретать?

Senya_L,
не совсем аналог, но для хранения некоторого количества инфы использовать можно, если рассматривать эти 128 байт как некую структуру, по смещению выделять поля и приводить типы. Масса ограничений конечно, но жить можно.
25 окт 09, 19:27    [7835851]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
iljy
Member

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

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

create table #context_info
(
VarName varchar(50) primary key,
value Sql_Variant
)
И используйте в свое удовольствие
25 окт 09, 19:34    [7835864]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
iljy,

Пасибо. Буду юзать времянки.
25 окт 09, 20:08    [7835936]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
MorAdan,

учтите только несколько моментов
1. временная таблица видна "вниз", т.е. её нужно создавать на уровне сессии
2. временная таблица - транзакционная, т.е. её изменения могут быть откачены.
3. модификация временных таблиц (а равно - и обычных) невозможна изнутри UDF.
25 окт 09, 22:17    [7836159]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
eyk
Guest
iljy
MorAdan,

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

create table #context_info
(
VarName varchar(50) primary key,
value Sql_Variant
)
И используйте в свое удовольствие


в этом случае, таблицу #context_info ведь нельзя будет использовать в разных хранимых процедурах? а нет ли в sql сервере аналога оракловских temporary_table ? там таблица существует всегда, а вот данные являются временными, очень удобно...
26 окт 09, 07:05    [7836616]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
eyk
iljy
MorAdan,

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

create table #context_info
(
VarName varchar(50) primary key,
value Sql_Variant
)
И используйте в свое удовольствие


в этом случае, таблицу #context_info ведь нельзя будет использовать в разных хранимых процедурах? а нет ли в sql сервере аналога оракловских temporary_table ? там таблица существует всегда, а вот данные являются временными, очень удобно...
Если временная таблица создана до вызова процедуры,
то она полностью доступна внутри этой процедуры.
26 окт 09, 08:49    [7836690]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
somebody
Member

Откуда: Москва
Сообщений: 708
eyk
в этом случае, таблицу #context_info ведь нельзя будет использовать в разных хранимых процедурах? а нет ли в sql сервере аналога оракловских temporary_table ?

Попробуйте глобальные временные таблицы ##table.

BOL
Local temporary tables are visible only to their creators during the same connection to an instance of SQL Server as when the tables were first created or referenced. Local temporary tables are deleted after the user disconnects from the instance of SQL Server. Global temporary tables are visible to any user and any connection after they are created, and are deleted when all users that are referencing the table disconnect from the instance of SQL Server.

Ну, естественно, удалять её можно и вручную (замечу на всякий случай)...
26 окт 09, 12:43    [7837852]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
somebody
Попробуйте глобальные временные таблицы ##table.
И чем она будет лучше постоянной?
26 окт 09, 12:45    [7837871]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
С использованием как постоянной, так и глобальной временной таблицы есть один нюанс - их нужно чистить в начале каждой сессии.
К тому же глобальная временная может "пропасть" в самых неожиданный момент :)

-------------------------
There’s no silver bullet!
26 окт 09, 13:49    [7838353]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Кроме того, по поводу постоянной - блокировки, все дела.
Может быть очень неудобно.

-------------------------
There’s no silver bullet!
26 окт 09, 13:50    [7838360]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31204
locky
Кроме того, по поводу постоянной - блокировки, все дела.
Может быть очень неудобно.

-------------------------
There’s no silver bullet!
Использование внешних временных таюлиц гарантирует перекомпиляции при каждом вызове.

В контексте данного вопроса проблем с использованием постоянной таблицы нет - при чтении с nolock блокировок не будет, запись делается только при коннекте.
26 окт 09, 14:24    [7838735]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
alexeyvg
запись делается только при коннекте.

Насколько я знаю - это немного не так,и запись ведется откуда попало.
26 окт 09, 15:12    [7839231]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31204
locky
alexeyvg
запись делается только при коннекте.

Насколько я знаю - это немного не так,и запись ведется откуда попало.
Это я про задачу автора писал:
MorAdan
при авторизации пользывателя данные о его сессии и коду хранились в контекстах и т.д.

Конечно, если нужно писать данные "сессии" позльзователя в транзакции и обойти это никак нельзя, то вариант с постоянными таблицами не подходит.
26 окт 09, 15:52    [7839537]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
alexeyvg
Это я про задачу автора писал:

Там дальше про триггера и т.д.
кроме того, не факт (далеко не факт) что авторизация пользователя происходит "сразу", а не "потом".
Вообще, зная любовь ораклоидов к пакетным переменным етк - тут могут быть проблемы, если не менять подход.
26 окт 09, 16:00    [7839595]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
eyk
Guest
locky

Вообще, зная любовь ораклоидов к пакетным переменным етк - тут могут быть проблемы, если не менять подход.


О да! пакетов мне в sql server очень не хватает :(
Просто удручает не возможность объединения серверного кода (процедуры и функции) в пакет...
26 окт 09, 19:40    [7840942]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
somebody
Member

Откуда: Москва
Сообщений: 708
iap
somebody
Попробуйте глобальные временные таблицы ##table.

И чем она будет лучше постоянной?

Это риторический вопрос?
Она может быть удобнее постоянной. Начнём с того, что не нужно поддерживать лишнюю структуру в БД. Если постоянную технологическую табличку случайно потрут (часто их держат во вспомогательных БД), будут проблемы. Ну и нагрузка с БД перекладывается на tempdb, что тоже может быть полезно при соответствующей организации. Да мало ли что. Зависит от ситуации. И постоянная может быть полезной - например, для отладки.

locky
К тому же глобальная временная может "пропасть" в самых неожиданный момент :)

Locky, с этого места поподробнее пожалуйста... Разъясните свою мысль.

eyk

О да! пакетов мне в sql server очень не хватает :(
Просто удручает не возможность объединения серверного кода (процедуры и функции) в пакет...

Полного аналога нет, но появились такие вещи, как project и solution... Есть script projects.
28 окт 09, 09:30    [7847616]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
eyk
Guest
somebody

Полного аналога нет, но появились такие вещи, как project и solution... Есть script projects.

не могли бы вы дать ссылки где про эти вещи почитать можно?

И еще такой вопрос:
как лучше всего организовать общий буфер данных в памяти, который будут использовать разные ХП. В оракле это можно сделать с помощью PL/SQL таблиц. Как сделать подобное
в ms sql не могу понять :(
29 окт 09, 07:55    [7853278]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
somebody
Member

Откуда: Москва
Сообщений: 708
автор
не могли бы вы дать ссылки где про эти вещи почитать можно?

В Books On-Line (BOL) введите ссылку:
BOL
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/toolref9/html/eb516c8c-083b-4b07-b815-227a0bb3d778.htm

Это англоязычная ссылка BOL SQL 2005, русскую поищите по указателю "проекты (среда SQL Server Management Studio)".

автор
как лучше всего организовать общий буфер данных в памяти, который будут использовать разные ХП. В оракле это можно сделать с помощью PL/SQL таблиц. Как сделать подобное
в ms sql не могу понять :(


Почему именно "в памяти"?

Используйте глобальные временные таблицы, о чём я уже говорил.
BOL
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/276ac771-2b3e-41e1-9b9f-669bacbed605.htm
, раздел Temporary Tables.

Есть ещё табличные переменные, но они действуют только в рамках своей хранимой процедуры, разве только передавать их через параметры.

Вообще, общение между хранимками можно организовать через параметры либо таблицы в БД/tempdb.
29 окт 09, 09:37    [7853549]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
aleks2
Guest
eyk
somebody

Полного аналога нет, но появились такие вещи, как project и solution... Есть script projects.

не могли бы вы дать ссылки где про эти вещи почитать можно?

И еще такой вопрос:
как лучше всего организовать общий буфер данных в памяти, который будут использовать разные ХП. В оракле это можно сделать с помощью PL/SQL таблиц. Как сделать подобное
в ms sql не могу понять :(


Ты не поверишь, но в MS SQL тоже есть ТАБЛИЦЫ!
B "разные ХП" могут к этим таблицам обращаться...
29 окт 09, 09:50    [7853605]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
aleks2
Guest
Ах да...

ключевые моменты

SUSER_SID()
@@SPID
sysprocesses

При некоторой доле сообразительности это позволяет не токмо хранить переменные сессии, но хранить параметры между сессиями. Шоб бедный зверек не страдал... нахерачивая это все каждый раз.

И не надо юзать времянки. Зачем себе гемоорой устраивать?
29 окт 09, 09:56    [7853638]     Ответить | Цитировать Сообщить модератору
 Re: Sys_Context для MsSQL(как в Oracle)  [new]
eyk
Guest
aleks2

Ты не поверишь, но в MS SQL тоже есть ТАБЛИЦЫ!
B "разные ХП" могут к этим таблицам обращаться...

PL/SQL таблицы в оракле - это не таблицы в общем смысле этого слова, это просто область в памяти сервера и соответственно все операции с данными в них выполняются гораздо быстрее

Сообщение было отредактировано: 29 окт 09, 10:54
29 окт 09, 10:52    [7854130]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить