Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Есть такая задача. АУдит действий пользователя.
Токо пользователь это не SQL User или Login. А это собственый созданный хранимый в отдельной таблице.
Архитектура такая. В каждом вызове любой XP первым параметром передаётся ID юзера. Значит хочу в начале каждой процедуры установить переменую
например так
@@USER_ID

которая будет потом использоваться в тригере.
т.е. Сессия создаваемая ХП, в которой потом начинается выполняться триггер, ему надо както передать USER_ID.
Как это можно сделать ?
Глобальная переменые @@ они потдерживают сессии ? Есть ли какието сессионые переменые или механизмы которые можно передовать между объектами ХП и триггерами
27 июн 03, 07:40    [243706]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Я так понимаю, что ID юзера свой, не сервера.
Тогда вопрос, а что в процедуре или триггере нельзя определить пользователя и, соответственно, его ID.
В конце концов, написать отпельную процедуру, которая будет определять пользователя запустившего её и вызывать эту процедуру во всех процедурах или триггерах.
27 июн 03, 07:46    [243711]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
А как ? Польлзователь передаётся ка int в ХП. Это получается его гдето надо сохранить, чтобы потом в тригере достать. Но если я его сохранюв таблице как я определю в тригере что это тат который еговызвал ? Я воти думал для еэтого использовать какуюнибудь сессионую переменую .
Что то наподобии @@IDENTITY. Он ведь как то работает
27 июн 03, 08:11    [243721]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Например сопоставив в этой таблице ID юзера и значение ф-ии system_user
27 июн 03, 08:18    [243724]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Слушай, Twinp, ты всё со своей проблемой определения кто же все-таки у тебя записи несанкционировано удаляет? Если так, то воспользуйся советом Glory (про SQL Profiler). Совсем несложно настроить профилер на фильтр по TextData LIKE %DELETE% и наслаждаться...
27 июн 03, 08:23    [243725]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Да нет, система 3-х уровневая, к базе обращается сервер приложений, под одинм пользователем, и все изменения идут от одного пользователя.
Так что совет Glory непоможет.
27 июн 03, 08:38    [243735]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 Twinp

Сначала мы себе придумываем сложности (3х уровневая архитектура), а потом пытаемся их решить. :-) Организуй отдельный слой аудита не на сиквеле, а в сиквеле храни тока записи по аудиту.

Но если я его сохранюв таблице как я определю в тригере что это тат который еговызвал ?

Ну в данном конкретном случаи сохрани еще SPID и LoginTime.
27 июн 03, 09:01    [243758]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
И что мне даст этот SPID, если он один и тот же, сервер приложений то один.
pkarklin - вы наверно неразу не разробатыали корпаротивные системы, если 3-х звенка это сложности. Да щас меньше чем на трех звеньев и построить то ничего незя. Даже тот же сайт он и то 3-звена имеет. Клиент-Сервер-База. :)
А проблему я решил. Только не так как я хотел.
27 июн 03, 09:33    [243794]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
И что мне даст этот SPID, если он один и тот же, сервер приложений то один.

Ну так соединение то у тебя ни одно. Правда если использовать пул соединений, то данный вариант не прокатит, согласен.

pkarklin - вы наверно неразу не разробатыали корпаротивные системы, если 3-х звенка это сложности.

Ага, я все больше дурью торгую.

Да щас меньше чем на трех звеньев и построить то ничего незя.

Видно и ты у меня покупал. :-)

А проблему я решил. Только не так как я хотел.

А вот уж если топик завел и проблему сам решил, то принято решение свое выкладывать.
27 июн 03, 09:40    [243804]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Twinp! pkarklin прав! Раз сам нашел решение, докладай обчеству!
27 июн 03, 09:55    [243817]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
Можно при коннекте писать свой ID пользователя в контекст коннекта.
27 июн 03, 14:26    [244332]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Это как ?
Только надо учитывать, что используется MIDAS. У которого одно соединение через SQL ADO Provider.

А пока я времено создал таблицу
в которой 2 поля одно IDENTITY а другое ID_USER
и когда вход в процедуру, туда добавляется овая запись а из тригера я потом достаю запись по @@IDENTITY которая работает в сессии. и достаю пользователя
ну таблица потом очищается конецно периодически
27 июн 03, 14:35    [244351]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
2Twinp
При соединении (или перед началом выполнения каких-то действий от имени пользователя) выполняется:
set context_info <здесь необходимая информация>

При необходимости получить данные они читаются:
select context_info from amster.dbo.sysprocesses where spid = @spid

Поле context_info - binary(128). Туда можно засунуть 32 целых числа.

Ну и у меня написаны ф-ции типа dbo.GetCurrentUser() и другие.
27 июн 03, 14:41    [244365]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
Правка
amster.dbo.sysprocesses
следует читать
master.dbo.sysprocesses
27 июн 03, 14:42    [244376]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Во, наверно то что надо. Я туда теперь столько запихаю, сенькс. огромный.
27 июн 03, 14:52    [244392]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
2Twinp
Тише, тише, там только 128 байт!!!
27 июн 03, 14:56    [244398]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Почитал документацию и у меня вопрос.
в ней написано что

SET CONTEXT_INFO
Associates up to 128 bytes of binary information with the current session or
connection.


т.е в контексте сесии и в контексте соединения.

далее

To get the current session context for the current connection, select the

context_info column from the master.dbo.sysprocesses row whose SQL Server
Process ID (SPID) is equal to the SPID for the connection. The SPID for the
сurrent connection is returned by the @@SPID function:

SELECT context_info
FROM master.dbo.sysprocesses
WHERE spid = @@SPID


и

The value in the context_info column is initialized to 128 bytes of binary zeros

if SET CONTEXT_INFO has not yet been executed for the current connection. If
SET CONTEXT_INFO has been executed, the context_info column contains the
value set by the last execution of SET CONTEXT_INFO for the current connection.
The context_info column is a varbinary(128) column.

This is an example of using session context information:

-- Set context information at start.

SET CONTEXT_INFO 0x1256698456
GO
-- Perform several non-related batches.

sp_who
GO
USE Northwind
GO
SELECT CustomerID
FROM Customers
WHERE City = 'London'
GO
-- Select context information set several batches earlier.

SELECT context_info
FROM master.dbo.sysprocesses
WHERE spid = @@spid
GO


и я смотрю что два кода что для сессии что для соединения одинаковы. Где же тут увереность что если я зделаю SET и пока ХП выполняется другая ХП тоже сделает сет и в конце 1-й ХП я получу первый SET а не второй. Т.е. в конце 1-й процедуры будет вызван триггер который получит 1-й SET.

По даному тексту я точного ответа на это не вижу.

Или я слепой, но то что я что то не допонимаю это точно.
Разъясните, плиз.
27 июн 03, 18:44    [244763]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Две эти проуедуры выполняются в одной сессии
27 июн 03, 18:48    [244770]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
2Twinp
Что-то я не понимаю этой фразы "если я зделаю SET и пока ХП выполняется другая ХП тоже сделает сет". В MSSQL коннект не делится на потоки. Можешь сделать SET и потом выполняй что угодно.

Кроме того, я не понимаю разницы между сессией и коннектом. Что вкладывается в эти понятия?
30 июн 03, 11:36    [245665]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Да собствено я уже всё проверил.
Всё работает так как надо.
Соединение, это вот например одна порграмма соединяется кбазе потом начинает выполнять запросы к ней.
Вот когда начинается выполняться запрос, например вызывается ХП которая потом вызывает другую ХП, ну и так далее связку.
Вот это я понимаю сессия.
Программа она может в двух потоках вызвать одну и туже ХП. Вот и получиться что две сессии работаую одновременно.
Так вот я и боялся что этот CONTEXT_INFO на уровне только соединения работать будте.

А вот те скрипт в котором я модулировал ситуацию

В QueryAnalyser запускаещь три окна и быстро в них выполняеш
ХП P1 с параметрами 0, 1, 2.
Потом посмотришьв таблице, и там цисла в строках должны совпадать, т.е.
CONTEXT_INFO не перемешался

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TRIGGERNAME]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)

drop trigger [dbo].[TRIGGERNAME]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[P1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[P1]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[T]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[T]
GO
CREATE TABLE [dbo].[T] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[sc] [varbinary] (128) NULL ,
[i] [int] NULL
) ON [PRIMARY]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
/*
** Add an object to the dtproperties table
*/

CREATE procedure dbo.P1
@s int
as
if( @s > 0 ) SET CONTEXT_INFO @s
declare @i int;
print @@spid
set @i = 0
print @i
while @i < 60
begin
WAITFOR DELAY '00:00:1'
print @i
set @i = @i + 1
/*
SELECT context_info
FROM master.dbo.sysprocesses
WHERE spid = @@spid
*/

INSERT INTO [temp].[dbo].[T]
([i])
SELECT @s
FROM master.dbo.sysprocesses
WHERE spid = @@spid
end
print @i
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE TRIGGER TRIGGERNAME ON [dbo].[T]
FOR INSERT
AS
update t set sc = (
SELECT context_info
FROM master.dbo.sysprocesses
WHERE spid = @@spid)
where id in (select id from inserted)
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
30 июн 03, 11:56    [245703]     Ответить | Цитировать Сообщить модератору
 Re: Область доступа @@Verable  [new]
Twinp
Member

Откуда:
Сообщений: 256
Вот же в документации используется
session context
current connection

To get the current session context for the current connection


а ещё я видел и scope что я собственно не очень понимаю, а только догадываюсь

Так что конект делиться на сессии а они помоему на scope
30 июн 03, 12:05    [245718]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить