2012-07-30 4 views
3

나중에 감사를 위해 테이블 ​​트리거에서 사용하기 위해 로그인 된 사용자 이름을 저장하기 위해 마스터 데이터베이스의 CONTEXT_INFO 속성을 사용하고 있습니다.Context_Info SQL Azure 바꾸기

SQL Azure로 마이그레이션하는 동안 데이터베이스 간 연결 문제가 발생했으며이 문제에 대한 직접적인 해결책을 찾을 수 없었습니다. 다음

이슈의 세부 사항은 다음과 같습니다

  1. 내가 데이터 액세스 레이어에서 절차 XXX를 저장하고 매개 변수로 이름을 통과 호출
  2. 사용자 이름은 XXX
  3. CONTEXT_INFO의 CONTEXT_INFO 값을 설정하는 데 사용됩니다
  4. 값은 테이블에서 사용됩니다. 응용 프로그램 감사를위한 사용자 이름 저장을위한 삽입/업데이트/삭제 트리거

지금까지 발견 한 솔루션은입니다.

  1. (CONTEXT_INFO를 설정) 마스터 데이터베이스에 대한 데이터 액세스 레이어에서 CONTEXT_INFO로 하나를
  2. 사용이 연결 문자열을 작업 할 데이터베이스에서 테이블을 작성하고 다른 하나는 응용 프로그램과 전에 SET CONTEXT_INFO 매번 실행 내 응용 프로그램에 대한 연결 열기
그러나 미래에는 여러 SQL Azure 데이터베이스를 통해 데이터베이스를 확장 할 때 특히 위험 할 수 있습니다.

감사합니다.

답변

4

내가 취한 접근법은 다음과 같습니다. 트릭에서 SQL Azure에서 실행되지 않는 실행을 확인하려면 'SET CONTEXT_INFO ...'를 호출해야합니다. 따라서 동일한 코드를 변경없이 로컬 SQL Server Express 및 Azure에서 실행할 수 있습니다.

  1. CREATE TABLE [dbo].[ContextInfo] (
        [ContextInfo] varbinary(128) not null, 
        [ApplicationUsername] nvarchar(128) not null, 
        [UpdatedAt] datetime NOT NULL, 
        CONSTRAINT [PK_UserContextInfo] PRIMARY KEY CLUSTERED ([ContextInfo] ASC) 
    ) 
    
  2. 저장 프로 시저를 작성 (안 마스터에 있지만 동일한 데이터베이스에서) 상황에 맞는 정보를 저장하는 테이블을 작성하는 응용 프로그램

    에서 호출 '설정 컨텍스트 정보'할
    CREATE PROCEDURE [dbo].[SetContextInfo] 
        @ApplicationUsername nvarchar(128) 
    AS 
    
    SET NOCOUNT ON 
    
    -- Remove all context items older than an 5 minutes ago 
    DELETE 
        FROM [dbo].[ContextInfo] 
    WHERE [UpdatedAt] < DATEADD(mi, -5, GETUTCDATE()) 
    
    -- 
    -- Use the MERGE command to do an update/insert 
    -- See: http://technet.microsoft.com/en-us/library/bb510625.aspx 
    -- 
    
    IF SERVERPROPERTY('edition') <> 'SQL Azure' 
    BEGIN 
        DECLARE @b varbinary(128) 
        SET @b = CONVERT(varbinary(128),newid()) 
        EXEC sp_executesql @statement=N'SET CONTEXT_INFO @b',@params=N'@b varbinary(128)',@[email protected] 
    END 
    
    DECLARE @ContextInfo varbinary(128) 
    SELECT @ContextInfo = CONTEXT_INFO() 
    
    MERGE [dbo].[ContextInfo] AS target 
    USING (SELECT @ContextInfo, @ApplicationUsername) AS source ([ContextInfo], [ApplicationUsername]) 
        ON (target.[ContextInfo] = source.[ContextInfo]) 
    WHEN MATCHED THEN 
         UPDATE SET [ApplicationUsername] = source.[ApplicationUsername], [UpdatedAt] = GETUTCDATE() 
    WHEN NOT MATCHED THEN 
         INSERT ([ContextInfo], [ApplicationUsername], [UpdatedAt]) 
         VALUES (source.[ContextInfo], source.[ApplicationUsername], GETUTCDATE()); 
    
  3. '컨텍스트 정보 가져 오기'를 할 수있는 저장 프로 시저 만들기 트리거 소스에서
  4. 는 사용

    DECLARE @UserContext TABLE ([Username] VARCHAR(128)) 
    INSERT INTO @UserContext (Username) 
    EXEC [dbo].[GetContextInfo] 
    

지금 당신이 테이블 변수에 저장된 이름을 가지고있다. 응용 프로그램 외부에서 관리자가 변경 사항을 적용하는 경우 사용자 이름이 설정되지 않았는지 확인하고 * SYSTEM_USER *와 같은 기본값을 확인하는 것이 좋습니다.

+0

Phil에게 감사드립니다.하지만 Table 솔루션을 사용하면 더 이상 CONTEXT_INFO를 사용할 필요가 없습니다. –