SQL Server 2005에서는 소유자 스키마를 소유하고 스키마 오브젝트를 소유합니다.

> 기호의 벌어진 쪽이 좁혀진 쪽을 소유한다는 의미로 사용했을 , 다음과 같이 표현할 있습니다.

소유자 > 스키마 > 오브젝트

 

따라서 소유자를 삭제할 경우에는 삭제할 소유자가 소유한 스키마의 소유권을 새로운 소유자에게 이전한 기존 소유자를 삭제하면 됩니다.

다음의 쿼리를 줄씩 실행해보시면 소유자 확인 이전, 삭제의 방법을 알게 되시리라 생각합니다.

반드시 충분한 테스트를 해보시고 실전에 사용하시기 바랍니다. ^^;;;

 

 

- SQL Server 2005 경우

 

00

/*************************************************************/

01

-- 사용자와 관련 오브젝트 목록 확인 사용자 삭제 - SQL Server 2005

02

/*************************************************************/

03

USE master;

04

GO

05

 

06

/*************************************************************/

07

/**-- 테스트를 위한 사용자, 스키마, 테이블 생성--------------------------*/

08

 

09

-- 테스트 데이터 베이스 생성

10

CREATE DATABASE AccTestDB;

11

 

12

-- 로그인 생성

13

CREATE LOGIN AccountTestA WITH PASSWORD = 'test1';

14

CREATE LOGIN AccountTestB WITH PASSWORD = 'test2';

15

GO

16

 

17

-- 사용자 생성

18

USE AccTestDB;

19

GO

20

CREATE USER AccountTestA FOR LOGIN AccountTestA WITH DEFAULT_SCHEMA = AccSchema;

21

CREATE USER AccountTestB FOR LOGIN AccountTestB WITH DEFAULT_SCHEMA = AccSchema;

22

GO

23

 

24

-- 테이블 생성 권한을 위한 역할 추가

25

EXEC sp_addrolemember 'db_owner', 'AccountTestA';

26

EXEC sp_addrolemember 'db_owner', 'AccountTestB';

27

GO

28

 

29

-- 스키마 생성

30

CREATE SCHEMA AccSchema AUTHORIZATION AccountTestA;

31

 

32

-- 사용자 생성 확인

33

SELECT * FROM sys.sysusers;

34

SELECT * FROM sys.schemas;

35

 

36

-- SQL Server 2005에서는 소유자.테이블이 아닌 스키마.테이블로 테이블을 생성

37

EXECUTE AS LOGIN = 'AccountTestA';

38

GO

39

CREATE TABLE AccSchema.AccTable (Col1 int);

40

GO

41

 

42

/*************************************************************/

43

/**-- AccountTestA 소유자인 오브젝트 목록 조회-------------------------*/

44

SELECT u.name as UserName, s.name as SchemaName, o.Type as ObjectType, o.name as ObjectName

45

FROM sys.sysusers u

46

JOIN sys.schemas s ON u.uid = s.principal_id

47

JOIN sys.objects o ON s.schema_id=o.schema_id

48

WHERE u.name = 'AccountTestA'

49

 

50

/*************************************************************/

51

/**-- SQL Server 2005에서는 소유자가 스키마를 소유하고

52

스키마가 오브젝트를 소유하기 때문에

53

        소유자를 삭제할 경우에는 오브젝트를 삭제하지 않고

54

삭제할 소유자가 소유한 스키마의 소유권을 이전한 ,

55

소유자를 삭제한다. --*/

56

 

57

-- 소유자삭제

58

DROP USER AccountTestA

59

/*

60

메시지15138, 수준16, 상태1, 1

61

데이터베이스 보안 주체는 데이터베이스의 스키마을() 소유하며 삭제할 없습니다.

62

*/

63

 

64

-- AccountTestA 소유자인 테이블 목록 조회

65

SELECT u.name as UserName, s.name as SchemaName

66

FROM sys.sysusers u JOIN sys.schemas s ON u.uid = s.principal_id

67

WHERE u.name = 'AccountTestA'

68

 

69

-- 소유권 이전

70

ALTER AUTHORIZATION ON SCHEMA::AccSchema TO AccountTestB;

71

GO

72

 

73

-- 삭제하려는 소유자를 가진 테이블 삭제 , 사용자 삭제

74

DROP USER AccountTestA;

75

GO

76

SELECT * FROM sys.sysusers WHERE name = 'AccountTestA';

77

GO

78

/*

79

메시지916, 수준14, 상태1, 1

80

현재 보안 컨텍스트로는 서버 보안 주체 "AccountTestA"() 데이터베이스 "AccTestDB" 액세스 없습니다.

81

 

82

*/

83

 

84

/*************************************************************/

85

-- 데이터베이스 삭제

86

REVERT;

87

 

88

USE master;

89

DROP DATABASE AccTestDB;

90

 

91

-- 로그인 삭제

92

DROP LOGIN AccountTestA;

93

DROP LOGIN AccountTestB;

 

 

 

- SQL Server 2000 경우

 

00

/*************************************************************/

01

-- 사용자와 관련 오브젝트 목록 확인- SQL Server 2000

02

/*************************************************************/

03

USE master;

04

GO

05

 

06

/*************************************************************/

07

/**-- 테스트를 위한 사용자 테이블 생성----------------------------------------------*/

08

 

09

-- 테스트 데이터베이스 생성

10

CREATE DATABASE AccTestDB

11

GO

12

 

13

-- 로그인 생성

14

EXEC sp_addlogin 'AccountTest', 'test', 'AccTestDB'

15

 

16

-- 사용자 생성

17

USE AccTestDB

18

GO

19

EXEC sp_adduser 'AccountTest'

20

GO

21

 

22

-- 테이블 생성 권한을 위한 역할 추가

23

EXEC sp_addrolemember 'db_owner', 'AccountTest'

24

 

25

-- 사용자 생성 확인

26

SELECT * FROM sysusers WHERE name = 'AccountTest'

27

 

28

-- 실행 사용자를 AccountTest 변경

29

SETUSER 'AccountTest'

30

 

31

-- 관련 테이블 생성

32

CREATE TABLE AccTable (Col1 int)

33

 

34

 

35

/*************************************************************/

36

/**-- AccountTest 소유자인 오브젝트 목록 조회-------------------------------------*/

37

SELECT o.xType as ObjectType, u.name as UserName, o.name as ObjectName

38

FROM sysusers u JOIN sysobjects o ON u.uid=o.uid

39

WHERE u.name = 'AccountTest'

40

 

41

 

42

/*************************************************************/

43

/**-- 소유자 삭제 테스트-------------------------------------------------------------------*/

44

-- 소유자 삭제

45

EXEC sp_dropuser 'AccountTest'

46

/*

47

서버: 메시지15183, 수준16, 상태1, 프로시저sp_MScheck_uid_owns_anything, 17

48

데이터베이스의 개체를 소유하고 있으므로 사용자를 삭제할 없습니다.

49

*/

50

 

51

-- AccountTest 소유자인 테이블 목록 조회

52

SELECT u.name, o.name FROM sysusers u JOIN sysobjects o ON u.uid=o.uid

53

WHERE u.name = 'AccountTest' and o.xType='U'

54

 

55

-- 로그인 생성

56

SETUSER

57

EXEC sp_addlogin 'AccountTest2';

58

 

59

-- 사용자 생성

60

EXEC sp_adduser 'AccountTest2';

61

 

62

-- 소유자 이전

63

EXEC sp_changeobjectowner 'AccountTest.AccTable' , 'AccountTest2';

64

/*

65

주의: 개체 이름부분을 변경하면 스크립트나 저장프로시저를 손상시킬 있습니다.

66

*/

67

 

68

-- 소유자 삭제 재시도

69

EXEC sp_dropuser 'AccountTest'

70

 

71

-- 로그인 삭제

72

EXEC sp_droplogin 'AccountTest'

73

 

74

-- 확인

75

SELECT * FROM master.dbo.SYSXLOGINS

76

SELECT * FROM SYSUSERS

77

 

78

/**--테스트 완료------------------------------------------------------------------------*/

79

-- 데이터베이스 삭제

80

USE master

81

DROP DATABASE AccTestDB

82

 

83

-- 로그인 삭제

84

EXEC sp_droplogin 'AccountTest2'

85

 

86

-- 확인

87

SELECT * FROM master.dbo.SYSXLOGINS

88

SELECT * FROM SYSUSERS

 

 

[출처] [MS SQL] 사용자 계정과 관련된 오브젝트 확인 및 삭제 (서버관리 마스터 - OS, WAS, DB, Network)



 

기존 로그인 확인


sp_hleplogins -- 기존 로그인 전체를 보여줌

sp_helplogins 'sa'  -- sa 계정에 대한 로그인 정보


로그인 생성과 삭제 


----- window 계정 --------------------------------------------------------------------

exec sp_grantlogin 'testuser' -- db접근 포함, 비번필요없음

exec sp_revokelogin 'testuser'

--------------------------------------------------------------------------------------


----- sql server 계정 -----------------------------------------------------------------  

exec sp_addlogin 'kimes','pwd123','test' -- '계정이름', '비밀번호','디폴트DB'

exec sp_droplogin 'kimes'

---------------------------------------------------------------------------------------


----- 로그인 유저 확인 ----------------------------------------------------------------

select name from master.dbo.sysxlogins

---------------------------------------------------------------------------------------


----- 암호 변경------------------------------------------------------------------------

exec sp_password 'kimes','kimes1234','kimes' -- '기존비번','새 비번','계정이름'

--------------------------------------------------------------------------------------


DB에 사용자 등록 


----- DB접근 권한 -------------------------------------------------------------------

use TEST

exec sp_grantdbaccess 'kimes'      -- 사용자 'kimes'에게 TEST DB에 접근허가(등록)

exec sp_revokedbaccess 'kimes'     -- 'kimes'의 TEST DB의 접근권한을 빼앗음(제거)

--------------------------------------------------------------------------------------


----- 현재 DB의 사용자 확 ---------------------------------------------------------

use TEST

select name from sysusers where islogin = 1

-------------------------------------------------------------------------------------


권 한 


----- OBJECT 사용권한 --------------------------------------------------------------

use TEST


grant select,delete,update,insert        -- select,delete,update,insert 권한을 

   on a                                  -- TEST DB의 a 라는 테이블에

   to kimes                              -- 'kimes'에게 허락


revoke delete                            -- delete 권한 취소

    on a

    to kimes


exec sp_helprotect a,null                -- a 테이블에 대해 주어진 권한보기


grant select(id,name)                    -- id,name이라는 특정 컬럼에만 select권한 허락

   on a

   to kimes


exec sp_helprotect null,kimes            -- 특정 컬럼에만 주어진 권한보기

-------------------------------------------------------------------------------------


----- statement 사용권한 -----------------------------------------------------------


grant create table                         -- create table 권한을                                      

   to kimes                                -- 'kimes'에게 허락


revoke create table                        -- create table 권한 취소

    to kimes

-------------------------------------------------------------------------------------


역 할 


----- server 역할 -------------------------------------------------------------------


exec sp_addsrvrolemember 'kimes','sysadmin'       -- system Administrator 권한 허락                                      


exec sp_dropaddsrvrolemember 'kimes','sysadmin'   -- system Administrator 권한 취소


exec sp_helpsrvrolemember 'sysadmin'              -- 서버역할 구성원 확인 

                                                  -- sysadmin 생략하면 전체 구성원 확인

-------------------------------------------------------------------------------------


----- database 역할 -----------------------------------------------------------------


exec sp_addrolemember 'db_owner','kimes'          -- DB 소유자 권한 허락


exec sp_droprolemember 'db_owner','kimes'         -- DB 소유자 권한 취소


exec sp_helprolemember 'db_datawrite'             -- DB역할 구성원 확인


-------------------------------------------------------------------------------------


from : http://yyrooyhh.tistory.com/


DBCC 명령어

설명

DBCC CHECKALLOC

지정된 데이터베이스에 대한 디스크 공간 할당 구조의 일관성을 검사합니다.

DBCC CHECKCATALOG

지정한 데이터베이스 내의 카탈로그 일관성을 검사합니다.

DBCC CHECKCONSTRAINTS

현재 데이터베이스의 지정한 테이블에서 특정 제약 조건이나 모든 제약 조건의 무결성을 검사합니다.

DBCC CHECKDB

현재 데이터베이스에 있는 모든 테이블의 할당과 구조적 무결성을 검사합니다.

DBCC CHECKFILEGROUP

지정한 파일 그룹에서 현재 데이터베이스에 있는 모든 테이블의 할당과 구조적 무결성을 검사합니다.

DBCC CHECKIDENT

지정한 테이블의 현재 ID 값을 검사하고 필요에 따라 변경합니다.

DBCC CHECKTABLE

특정 테이블 또는 특정 인덱싱된 뷰를 구성하는 모든 페이지 구조의 무결성을 검사합니다.

DBCC DBREINDEX

지정한 데이터베이스의 테이블에 대해 하나 이상의 인덱스를 다시 작성합니다. 그렇지만 기능은 다음 버전에서 제거될 예정이므로 ALTER INDEX 사용하는 것을 권고합니다.

DBCC DROPCLEANBUFFERS

버퍼 풀에서 버퍼를 모두 제거하는 명령어입니다. DBCC DROPCLEANBUFFERS 사용하면 서버를 종료하고 다시 시작하지 않아도 완전히 버퍼 캐시를 사용하여 쿼리를 테스트할 있습니다. 성능 튜닝 테스트에 활용할 있습니다.

DBCC FREEPROCCACHE

프로시저 캐시를 비우는 명령어입니다

 

DBCC 명령어

설명

DBCC FREESESSIONCACHE

분산 쿼리에서 Microsoft SQL Server 인스턴스에 대해 사용한 분산 쿼리 연결 캐시를 플러시합니다.

DBCC FREESYSTEMCACHE

모든 캐시의 사용하지 않는 캐시 항목을 모두 해제합니다. SQL Server 2005 데이터베이스 엔진은 현재 항목에 필요한 메모리 확보를 위해 사용하지 않는 캐시 항목을 백그라운드에서 미리 정리합니다. 하지만 명령을 사용해 사용하지 않는 항목을 모든 캐시에서 직접 제거할 있습니다.

DBCC HELP

지정한 DBCC 명령의 구문 정보를 제공합니다.

DBCC INDEXDEFRAG

지정된 테이블 또는 뷰의 인덱스를 조각 모음합니다.

기능은 다음 버전에서 제거될 예정이므로, 명령어대신 ALTER INDEX 사용하는 것을 권고합니다..

DBCC INPUTBUFFER

클라이언트가 Microsoft SQL Server 2005 인스턴스로 마지막으로 전송한 SQL 문을 반환합니다.

DBCC OPENTRAN

지정한 데이터베이스에서 가장 오래된 활성 트랜잭션과 가장 오래된 분산 비분산 복제 트랜잭션에 대한 정보를 표시합니다. 활성 트랜잭션이 있거나 데이터베이스에 복제 정보가 있는 경우에만 결과가 반환됩니다.

DBCC OUTPUTBUFFER

지정한 session_id 현재 출력 버퍼를 16진수와 ASCII 형식으로 반환합니다.

DBCC PINTABLE

제거된 기능입니다. 오류 메시지는 반환하지 않지만 실제로는 효력이 없습니다. 마찬가지로 DBCC UNPINTABLE 제거되었습니다.

DBCC PROCCACHE

프로시저 캐시에 대한 정보를 테이블 형식으로 반환합니다.

DBCC SHOW_STATISTICS

지정한 테이블에서 특정 대상에 대한 현재 배포 통계를 제공합니다.

 

DBCC SHOWCONTIG

지정한 테이블의 데이터와 인덱스에 대한 조각화 정보를 제공합니다. 기능은 다음 버전에서 제거될 예정이므로 대신 sys.dm_db_index_physical_stats 사용하는 것을 권고합니다.

DBCC SHRINKDATABASE

지정한 데이터베이스의 데이터 파일의 크기를 축소합니다.

DBCC SHRINKFILE

지정한 데이터베이스에서 지정한 파일(데이터 파일이나 로그 파일) 크기를 축소합니다.

DBCC SQLPERF

모든 데이터베이스의 트랜잭션 로그 공간에 관한 통계를 제공합니다.

DBCC TRACEON

지정한 추적 플래그를 활성화합니다.

DBCC TRACEOFF

지정한 추적 플래그를 해제합니다.

DBCC TRACESTATUS

추적 플래그의 상태 정보를 제공합니다.

DBCC UPDATEUSAGE

카탈로그 뷰의 부정확한 페이지와 개수를 보고하고 수정합니다. 페이지와 개수가 부정확하면 sp_spaceused 시스템 저장 프로시저에서 반환하는 공간 사용 정보가 정확하지 않게 됩니다. SQL Server 2005 에서는 항상 정확한 값이 유지 관리되기 때문에 SQL Server 2005 에서 만든 데이터베이스에서는 개수가 부정확한 경우가 없지만 SQL Server 2005 업그레이드한 데이터베이스에는 올바르지 않은 개수가 포함될 있으므로 SQL Server 2005 업그레이드한 다음에는 DBCC UPDATEUSAGE 실행하여 올바르지 않은 개수를 수정하는 것이 좋습니다.

DBCC USEROPTIONS

현재의 연결에 설정되어 있는 SET 옵션 정보를 제공합니다.

[출처] DBCC명령어|작성자 팬더


Use DBNAME;
GO

alter database DBNAME set single_user;
GO

// DB 단위
dbcc checkdb(DBNAME, REPAIR_FAST | REPAIR_REBUILD | REPAIR_ALLOW_DATA_LOSS);
GO

// 테이블 단위
dbcc checktable(TABLENAME, REPAIR_FAST | REPAIR_REBUILD | REPAIR_ALLOW_DATA_LOSS);
GO

// 할당 에러를 점검
dbcc newalloc(DBNAME);
GO


alter database DBNAME set multi_user;
GO



<파라메터>

REPAIR_ALLOW_DATA_LOSS

보고된 모든 오류를 복구합니다. 이러한 복구를 수행하면 일부 데이터가 손실될 수 있습니다.

REPAIR_FAST

이전 버전과의 호환성을 위해서만 구문을 유지 관리합니다. 복구 동작은 수행되지 않습니다.

REPAIR_REBUILD

데이터 손실 가능성이 없는 복구를 수행합니다. 여기에는 비클러스터형 인덱스의 누락 행 복구와 같은 빠른 복구 작업과 인덱스 다시 작성과 같이 시간이 오래 걸리는 복구가 모두 포함됩니다.

REPAIR_REBUILD는 FILESTREAM 데이터 관련 오류를 복구하지 않습니다.



'Database > SQL-Server' 카테고리의 다른 글

MS_SQL SERVER 2000 로그인 생성, 역할 지정  (0) 2011.06.29
DBCC 명령어  (0) 2011.06.29
[MSSQL] 날짜 연산 DATEADD  (0) 2011.05.13
MSSQL dateadd() 이용하여 말일, 초일 구해보자  (0) 2011.05.13
MSSQL Date Type Convert  (0) 2011.05.13
초보 관리자/DB 2009/01/29 11:24 by 비트센스
 
짬짬히 이런 저런 작업을 하면서 글을 쓰기 때문에,
실제 사용하는 것만 올립니다. 덕분에 글이 짧네요.

MSSQL에서 날짜 연산 방법입니다.

예. 어제 일자를 알고 싶다.
select getdate(), dateadd(d, -1, getdate())
쉽죠? ^^;;

연산 날짜 부분(datepart) 인지는 몇개 없습니다.

yy : 년
mm : 월
dy, y : dayofyear (먼지 잘 모르겠음)
d : 일
wk : 주
hh : 시
mi, n : 분
s : 초
ms : 밀리세컨드

declare @날자 datetime

set @날자='2008-01-01'

---현재월의 초일 --
SELECT dateadd(d,-day(@날자)+1,@날자)

---현재월의 말일 --
SELECT dateadd(d,-day(dateadd(m,1,@날자)), dateadd(m,1,@날자))

---전월의 초일 --
SELECT dateadd(m,-1, dateadd(d,-day(@날자)+1,@날자))

---전월의 말일 --
SELECT dateadd(d,-day(@날자),@날자)

== 또다른 매달말일 구하는 법
SELECT CONVERT(Char(8), DateAdd(day, -1, DateAdd(month, 1, @종료월 + '01')), 112)

'Database > SQL-Server' 카테고리의 다른 글

DBCC 명령어  (0) 2011.06.29
DBCC CHECKDB, CHECKTABLE (손상된 테이블 복구)  (0) 2011.06.27
[MSSQL] 날짜 연산 DATEADD  (0) 2011.05.13
MSSQL Date Type Convert  (0) 2011.05.13
[MSSQL - SELECT 와 INSERT 동시 처리]  (0) 2011.05.09
0 Feb 22 2006 4:26PM CONVERT(CHAR(19), DATETIME, 0)
1 02/22/06 CONVERT(CHAR(8), DATETIME, 1)
2 06.02.22 CONVERT(CHAR(8), DATETIME, 2)
3 22/02/06 CONVERT(CHAR(8), DATETIME, 3)
4 22.02.06 CONVERT(CHAR(8), DATETIME, 4)
5 22-02-06 CONVERT(CHAR(8), DATETIME, 5)
6 22 Feb 06 CONVERT(CHAR(9), DATETIME, 6)
7 Feb 22, 06 CONVERT(CHAR(10), DATETIME, 7)
8 16:26:08 CONVERT(CHAR(8), DATETIME, 8)
9 Feb 22 2006 4:26:08:020PM CONVERT(CHAR(26), DATETIME, 9)
10 02-22-06 CONVERT(CHAR(8), DATETIME, 10)
11 06/02/22 CONVERT(CHAR(8), DATETIME, 11)
12 060222 CONVERT(CHAR(6), DATETIME, 12)
13 22 Feb 2006 16:26:08:020 CONVERT(CHAR(24), DATETIME, 13)
14 16:26:08:037 CONVERT(CHAR(12), DATETIME, 14)
20 2006-02-22 16:26:08 CONVERT(CHAR(19), DATETIME, 20)
21 2006-02-22 16:26:08.037 CONVERT(CHAR(23), DATETIME, 21)
22 02/22/06 4:26:08 PM CONVERT(CHAR(20), DATETIME, 22)
23 2006-02-22 CONVERT(CHAR(10), DATETIME, 23)
24 16:26:08 CONVERT(CHAR(8), DATETIME, 24)
25 2006-02-22 16:26:08.037 CONVERT(CHAR(23), DATETIME, 25)
100 Feb 22 2006 4:26PM CONVERT(CHAR(19), DATETIME, 100)
101 02/22/2006 CONVERT(CHAR(10), DATETIME, 101)
102 2006.02.22 CONVERT(CHAR(10), DATETIME, 102)
103 22/02/2006 CONVERT(CHAR(10), DATETIME, 103)
104 22.02.2006 CONVERT(CHAR(10), DATETIME, 104)
105 22-02-2006 CONVERT(CHAR(10), DATETIME, 105)
106 22 Feb 2006 CONVERT(CHAR(11), DATETIME, 106)
107 Feb 22, 2006 CONVERT(CHAR(12), DATETIME, 107)
108 16:26:08 CONVERT(CHAR(8), DATETIME, 108)
109 Feb 22 2006 4:26:08:067PM CONVERT(CHAR(26), DATETIME, 109)
110 02-22-2006 CONVERT(CHAR(10), DATETIME, 110)
111 2006/02/22 CONVERT(CHAR(10), DATETIME, 111)
112 20060222 CONVERT(CHAR(8), DATETIME, 112)
113 22 Feb 2006 16:26:08:067 CONVERT(CHAR(24), DATETIME, 113)
114 16:26:08:067 CONVERT(CHAR(12), DATETIME, 114)
120 2006-02-22 16:26:08 CONVERT(CHAR(19), DATETIME, 120)
121 2006-02-22 16:26:08.080 CONVERT(CHAR(23), DATETIME, 121)
126 2006-02-22T16:26:08.080 CONVERT(CHAR(23), DATETIME, 126)
127 2006-02-22T16:26:08.080 CONVERT(CHAR(23), DATETIME, 127)
130 24 ???? 1427 4:26:08:080PM CONVERT(CHAR(32), DATETIME, 130)
131 24/01/1427 4:26:08:080PM CONVERT(CHAR(25), DATETIME, 131)


[MSSQL - SELECT 와 INSERT 동시 처리]

편의상 아래와 같은 세개의 테이블이 있다고 가정하겠습니다.

CREATE TABLE [dbo].[table_a] (
[seq] [int] PRIMARY KEY NOT NULL,
[Name] [varchar] (70) NOT NULL,
[Email] [varchar] (70) NOT NULL,
[Idate] [datetime] NOT NULL
)

CREATE TABLE [dbo].[table_b] (
[seq] [int] PRIMARY KEY NOT NULL,
[Name] [varchar] (70) NOT NULL,
[Email] [varchar] (70) NOT NULL,
[Idate] [datetime] NOT NULL
)


CREATE TABLE [dbo].[table_c] (
[seq] [int] PRIMARY KEY NOT NULL,
[Name] [varchar] (70) NOT NULL,
[Nickname] [varchar] (255) NULL,
[Email] [varchar] (70) NOT NULL,
[Tel] [varchar] (20) NULL,
[Idate] [datetime] NOT NULL
)

첫번째와 두번째의 테이블인 table_atable_b 는 컬럼의 갯수 및 데이터형식이 똑 같은 쌍동이 테이블입니다., table_c두개의 컬럼(Nickname, Tel)이 더 추가되어 있는 테이블로 table_atable_c 와는 조금 다른 구조를
가지고 있습니다.



1. 두 테이블의 컬럼이 같을때 SELECT INSERT 하기

두개의 테이블간에 컬럼이 table_a 와 table _b 처럼 완전히 일치할 때는 아래와 같이 간단하게 처리할 수 있습니다.

-- 사용법

INSERT INTO [입력될 테이블명] SELECT * FROM [검색되는 테이블명]

예1) INSERT INTO table_b SELECT * FROM table_a

위의 예1) 에서는 table_a 의 레코드 전체를 table_b 로 삽입(INSERT) 시킵니다. 만약에 조건을 주어 데이터를 삽입(INSERT) 시키려 한다면 아래와 같이 뒤에 WHERE 절만 추가해 주시면 됩니다.

예2)
INSERT INTO table_b SELECT * FROM table_a WHERE seq = 2

위의 SQL 문은 table_a 에서 seq 의 값이 2 인 레코드를 table_b 에 INSERT 시킵니다.



2 . 두 테이블간의 컬럼이 일치하지 않을때 SELECT INSERT 하기


두개의 테이블간에 컬럼이 table_a 와 table _c 처럼 일치하지 않을때는 아래와 같이 컬럼명을 지정해 주시면됩니다.

-- 사용법

INSERT INTO [입력될 테이블명] (컬럼1, 컬럼2, ... ) SELECT 컬럼1, 컬럼2, ... FROM [검색되는 테이블명]

예3) INSERT INTO table_c ( seq, Name, Email, Idate ) SELECT seq, Name, Email, Idate FROM table_a

위의 예3) 에서는 table_a 의 컬럼중 seq, Name, Email, Idate 컬럼을 table_c 에 Insert 시키고 있습니다. 한가지 주의
할 것은 table_c 의 구조가 table_b 와 다른 만큼 INSERT 될 컬럼이 SELECT 되는 컬럼과 일치하지 않으면 아래와 같은
에러가 발생하게 됩니다.

서버: 메시지 213, 수준 16, 상태 4, 줄 1
삽입 오류: 제공된 값의 개수나 열 이름이 테이블 정의와 일치하지 않습니다.




3.
SELECT INTO 를 이용한 데이터 삽입

위에서 설명한 SELECT INSERT 는 테이블의 검색결과를 이미 존재하는 테이블에 삽입(INSERT) 하게됩니다.하지만 SELECT INTO 는 테이블의 검색결과를 INTO 문 다음에 지정한 테이블을 새로 생성시켜서 삽입하게 됩니다. INTO 문 다음의 테이블은 반드시 존재하지 않아야 합니다. 존재하는 테이블이라면 아래와 같은 에러가 발생하게 됩니다.

서버: 메시지 2714, 수준 16, 상태 6, 줄 1
데이터베이스에 'table_d'(이)라는 개체가 이미 있습니다.

-- 사용법

SELECT * INTO [생성될 테이블명] FROM [검색되는 테이블명]

예4) SELECT * INTO table_d FROM table_a

위의 예4) 에서는 table_a 의 내용을 table_d라는 테이블을 새로 생성시켜서 삽입하게 됩니다. 조건절을 추가하려면
검색되는 테이블명 뒤에 추가하면 됩니다.

예5)
SELECT * INTO table_d FROM table_a
WHERE seq = 3

위의 SQL 문은 table_a 에서 seq 의 값이 3인 레코드를 새로 생성되는 table_d 에 INSERT 시킵니다.

 

작성자: 웹마당넷(webmadang@webmadang.net)   http://www.webmadang.net 

'Database > SQL-Server' 카테고리의 다른 글

DBCC 명령어  (0) 2011.06.29
DBCC CHECKDB, CHECKTABLE (손상된 테이블 복구)  (0) 2011.06.27
[MSSQL] 날짜 연산 DATEADD  (0) 2011.05.13
MSSQL dateadd() 이용하여 말일, 초일 구해보자  (0) 2011.05.13
MSSQL Date Type Convert  (0) 2011.05.13

+ Recent posts