반응형
반응형

한대성

SQL Server MVP

에이디컨설팅 | SQLLeader.com

 

 

Service Pack 2 이후에 몇 가지 새로운 기능들 중에서 유용한 기능을 하나 소개 드립니다.

 

SQL Server 2005에 추가된 DDL 트리거 중, 로그온과 관련된 이벤트가 추가되었습니다.

이를 이용하여, SQL Server에 로그인한 정보를 테이블이나 다른 형태에 별도로 남길 수 있습니다.

 

Logon 이벤트 정보를 기록할 테이블 생성

USE master

GO

 

IF EXISTS (SELECT * FROM sys.tables WHERE type = 'U' AND Name = N' Login_Info_Table ')

        DROP TABLE Login_Info_Table

GO

 

CREATE TABLE Login_Info_Table (

        PostTime datetime,            -- 로그온 시간

        SID varbinary(85),            -- 로그인에 대한 보안 아이디(Security ID)

        ClientHost nvarchar(100),     -- 연결을 Client Host ID.

                                      -- 서버에서 연결할 경우 으로 저장됨

        LoginName nvarchar(100),      -- 로그온

        LoginType nvarchar(30),       -- 로그온 유형

        IsPooled tinyint              -- 연결 풀링 여부

)

GO

 

 

LOGON 이벤트에 대한 DDL 트리거 생성

IF EXISTS (SELECT * FROM sys.server_triggers WHERE NAME = 'Trg_Logon_Info')

        DROP TRIGGER Trg_Logon_Info on ALL SERVER

GO

 

CREATE TRIGGER Trg_Logon_Info

ON ALL SERVER FOR LOGON

AS

BEGIN

        DECLARE @data XML

        SET @data = EVENTDATA()

 

        INSERT INTO Login_Info_Table(PostTime, SID, ClientHost,

                        LoginName, LoginType, IsPooled)

        SELECT GETDATE(),

               @data.value('(/EVENT_INSTANCE/SID)[1]', 'varbinary(85)'),

               @data.value('(/EVENT_INSTANCE/ClientHost)[1]', 'nvarchar(100)'),

               @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),

               @data.value('(/EVENT_INSTANCE/LoginType)[1]', 'nvarchar(30)'),

               @data.value('(/EVENT_INSTANCE/IsPooled)[1]', 'tinyint')

END

GO

 

 

트리거 생성 확인

SELECT * FROM sys.server_triggers

GO

 


트리거 삭제

DROP TRIGGER Trg_Logon_Info on ALL SERVER

GO

 

 

 

 

결과 확인

 

 

이를 이용하면 ProfilerPSSDiag, 또는 다른 Audit 툴을 이용하지 않고도 SQL Server에 로그인 한 정보를 기록을 남길 수 있습니다.

, SQL Server 2005 Service Pack 2 이상이 설치되어야 LOGON에 대한 DDL 트리거 생성이 가능합니다.

 

 

 

본 게시판에 실린 글은 누구나 복사하셔서 이용하셔도 되지만, 반드시 출처(SQLLeader.com) 및 글의 링크를 밝혀주셔야 합니다. 

 

반응형
반응형
MS 공식 기술자료 Link
http://support.microsoft.com/kb/918992/en-us




SQL Server 7.0 2000 버전에서는 다음 기술자료에 나오는 바와 같이
인스턴스간 로그인 및 암호 전송이 가능합니다.
http://support.microsoft.com/kb/246133/


SQL Server 2005
에서도 인스턴스간에 로그인 및 암호를 전송하는 프로시저가 있어서 소개해 드립니다...

 

USE master

GO

 

IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL

   DROP PROCEDURE sp_hexadecimal

GO

 

CREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256),@hexvalue varchar(256) OUTPUT

AS

   DECLARE @charvalue varchar(256)

   DECLARE @i int

   DECLARE @length int

   DECLARE @hexstring char(16)

 

   SELECT @charvalue = '0x'

   SELECT @i = 1

   SELECT @length = DATALENGTH (@binvalue)

   SELECT @hexstring = '0123456789ABCDEF'

 

   WHILE (@i <= @length)

   BEGIN

      DECLARE @tempint int

      DECLARE @firstint int

      DECLARE @secondint int

      SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))

      SELECT @firstint = FLOOR(@tempint/16)

      SELECT @secondint = @tempint - (@firstint*16)

      SELECT @charvalue = @charvalue +

      SUBSTRING(@hexstring, @firstint+1, 1) +

      SUBSTRING(@hexstring, @secondint+1, 1)

      SELECT @i = @i + 1

   END

      SELECT @hexvalue = @charvalue

GO

 

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL

   DROP PROCEDURE sp_help_revlogin

GO

 

 

 

CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS

   DECLARE @name sysname

   DECLARE @xstatus int

   DECLARE @binpwd varbinary (256)

   DECLARE @txtpwd sysname

   DECLARE @tmpstr varchar (256)

   DECLARE @SID_varbinary varbinary(85)

   DECLARE @SID_string varchar(256)

   DECLARE @pwd varchar (256)

 

   IF (@login_name IS NULL)

      DECLARE login_curs CURSOR FOR

         SELECT sid, name, is_disabled, password_hash FROM master.sys.sql_logins

         WHERE type='S' AND name <> 'sa'

   ELSE

      DECLARE login_curs CURSOR FOR

         SELECT sid, name, is_disabled, password_hash FROM master.sys.sql_logins

         WHERE type='S' AND name = @login_name

 

   OPEN login_curs

   FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd

      IF (@@fetch_status = -1)

      BEGIN

         PRINT 'No login(s) found.'

         CLOSE login_curs

         DEALLOCATE login_curs

         RETURN -1

      END

 

         SET @tmpstr = '/* sp_help_revlogin script '

         PRINT @tmpstr

         SET @tmpstr = '** Generated '

         + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'

         PRINT @tmpstr

         PRINT ''

         PRINT 'DECLARE @pwd sysname'

 

      WHILE (@@fetch_status <> -1)

         BEGIN

            IF (@@fetch_status <> -2)

               BEGIN

                  PRINT ''

                  SET @tmpstr = '-- Login: ' + @name

                  PRINT @tmpstr

 

                  IF (@xstatus & 4) = 4

                     BEGIN -- NT authenticated account/group

                        IF (@xstatus & 1) = 1

                           BEGIN -- NT login is denied access

                              SET @tmpstr='CREATE LOGIN [' + @name +'] FROM WINDOWS'

                              PRINT @tmpstr

                              SET @tmpstr='DENY CONNECT SQL TO[' + @name +']'

                              PRINT @tmpstr

                           END

                        ELSE

                           BEGIN -- NT login has access

                              SET @tmpstr='CREATE LOGIN [' + @name +'] FROM WINDOWS'

                              PRINT @tmpstr

                           END

                     END

                  ELSE

                     BEGIN -- SQL Server authentication

                        IF (@binpwd IS NOT NULL)

                           BEGIN -- Non-null password

                              EXEC sp_hexadecimal @binpwd, @txtpwd OUT

                              EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

                              SET @tmpstr = 'CREATE LOGIN ' +@name+ ' WITH PASSWORD='+ @txtpwd+ ' HASHED,SID=' + @SID_string

                           END

                        ELSE

                           BEGIN

                              -- Null password

                              EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

                              SET @tmpstr = 'CREATE LOGIN ' +@name+ ' WITH PASSWORD='''',SID=' + @SID_string

                           END     

 

                     PRINT @tmpstr

                     END

 

            END

 

            FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd

         END

 

   CLOSE login_curs

   DEALLOCATE login_curs

   RETURN 0

GO

 

 

 



[
따라하기]

--임의의 로그인 AAA  를생성

CREATE LOGIN AAA WITH PASSWORD='P@ssword'

GO

 

--로그인 생성 스크립트 생성

EXEC sp_help_revlogin

/*

/* sp_help_revlogin script

** Generated 05  3 2006  5:53PM on DSHANNOTE */

   

DECLARE @pwd sysname

   

-- Login: AAA

CREATE LOGIN AAA WITH PASSWORD=0x010032B33F8F5C29F519C7453917FEE2292CDF1068D52158AC51 HASHED,SID=0xE8FE830659D7CC4A8D3AB3EECA79911B

*/

 

DROP LOGIN AAA

GO

 

--생성된 스크립트를 이용하여 AAA 로그인복원

DECLARE @pwd sysname

-- Login: AAA

CREATE LOGIN AAA WITH PASSWORD=0x010032B33F8F5C29F519C7453917FEE2292CDF1068D52158AC51 HASHED,SID=0xE8FE830659D7CC4A8D3AB3EECA79911B

GO

 

--AAA 로그인이 되는지 테스트 수행

 

반응형

'연구개발 > DBA' 카테고리의 다른 글

SQL 서버를 활용한 성능 카운터 수집  (0) 2009.07.25
파일 그룹별 개체 리스트 및 Size 관리  (0) 2009.07.25
sys.extended_properties  (0) 2009.07.21
parsename  (0) 2009.07.20
xp_crypt  (0) 2009.07.19
반응형

T-SQL 문을 사용하여 SQL Server 로그인 계정을 생성하고, 생성한 계정의 기본 스키마를 지정하는 예제입니다.

로그인 사용자 생성하기

--dbadmin 로그인 계정을 생성합니다.
CREATE LOGIN dbadmin WITH PASSWORD = ‘ad1234’;

GO

-- dbadmin 로그인에 대한 사용자를 생성합니다.

-- 사용자의 기본 스키마는 MySchema 설정합니다. 이때 해당 스키마는 미리 생성하지 -- 않아도 됩니다.

CREATE USER UserA FOR LOGIN dbadmin

  WITH DEFAULT_SCHEMA = MySchema;

GO

-- MySchema 스키마를 생성하고 스키마의 소유권을 UserA 할당합니다.

CREATE SCHEMA MySchema AUTHORIZATION UserA;

GO

-- MySchema 내에서 Table1 테이블을 생성합니다.

CREATE TABLE MySchema.Table1 (seq int);

GO

 

 

로그인 확인하기

EXEC sp_helplogins;

GO

 

사용자 역할과 같은 보안 주체 확인하기

SELECT * FROM sys.database_principals;

GO

 

현재 서버에 존재하는 스키마 정보 확인하기

-- 스키마는 자신을 소유하는 보안주체의 아이디 (principal_id) 가지고 있습니다.

SELECT * FROM sys.schemas;

GO

 

반응형

+ Recent posts

반응형