/****** Object: Table [dbo].[Auth_Role_Page] Script Date: 10/23/2014 16:55:25 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[Auth_Role_Page]([role_page_idx] [int] NOT NULL,[com_code] [nvarchar](5) NULL,--회사코드[role_id] [nvarchar](20) NULL,--권한수준[page_id] [varchar](8) NULL,--메뉴번호[reg_date] [datetime] NULL,[reg_userid] [nvarchar](20) NULL,[pop] [char](1) NULL,[seq] [int] NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGO
이런 구조의 테이블이 있습니다.
뭔가 제약 조건이 걸리긴 했는데 내용을 보니 그냥 날자를 reg_date 에 넣는것 뿐이였고
의미 없는 role_page_idx 에만 키값이 걸려있고 아무것도 안되있더군요;;
그렇다보니 아래처럼 입력할경우 중복처리가 안되버립니다.
테이블 세팅 자체에서 그룹키(?)같은게 지정되있어서 중복 안되게끔 해야하는데
Role_Id ,Page_Id , com_code 세개 합쳐서 중복이 안되게끔..
테이블 열을 바꿀수는 없고
그룹키 지정같은걸 해야하는데 방법을 모르겠구
IF OBJECT_ID('tempdb..#tblComCode') IS NOT NULL -- 임시테이블이 있을 경우DROP TABLE #tblComCode -- 임시테이블 삭제CREATE TABLE #tblComCode( com_code NVARCHAR(5))GOIF OBJECT_ID('tempdb..#tblRoleId') IS NOT NULL -- 임시테이블이 있을 경우DROP TABLE #tblRoleId -- 임시테이블 삭제CREATE TABLE #tblRoleId(Role_Id NVARCHAR(20))GOIF OBJECT_ID('tempdb..#tblPageId') IS NOT NULL -- 임시테이블이 있을 경우DROP TABLE #tblPageId -- 임시테이블 삭제CREATE TABLE #tblPageId(Page_Id NVARCHAR(4))GOIF OBJECT_ID('tempdb..#Auth_Role_Page') IS NOT NULL -- 임시테이블이 있을 경우DROP TABLE #Auth_Role_Page -- 임시테이블 삭제CREATE TABLE #Auth_Role_Page(com_code NVARCHAR(5),role_id NVARCHAR(20),page_id NVARCHAR(4))GO-- 사업장 설정INSERT INTO #tblComCode( com_code )VALUES( N'C001' ),--( N'C002' ),--( N'C003' ),----( N'C004' ),----( N'C005' ),( N'C006' ),----( N'C007' ),--( N'C008' ),( N'C009' )----( N'C010' )--GO-- 권한 설정INSERT INTO #tblRoleId( Role_Id )VALUES ( N'admin' ),( N'root' ),( N'user' )GO-- 권한 설정할 메뉴INSERT INTO #tblPageId( Page_Id )VALUES( N'B569' ),( N'B896' ),( N'B897' ),( N'B898' ),( N'B899' ),( N'B865' ),( N'B861' ),( N'B900' )GO--SELECT A.com_code,B.Role_Id,C.Page_Id--FROM #tblComCode A--CROSS APPLY #tblRoleId B--CROSS APPLY #tblPageId C--ORDER BY A.com_code,B.Role_Id,C.Page_IdINSERT INTO Auth_Role_Page( com_code, role_id, page_id )SELECT A.com_code,B.Role_Id,C.Page_IdFROM #tblComCode ACROSS APPLY #tblRoleId BCROSS APPLY #tblPageId CORDER BY A.com_code,B.Role_Id,C.Page_IdSELECT * FROM Auth_Role_PageDROP TABLE #Auth_Role_PageDROP TABLE #tblPageIdDROP TABLE #tblRoleId -- 임시테이블 삭제DROP TABLE #tblComCode -- 임시테이블 삭제
이미 중복된 데이터도 들어가 버렸다는것도 문제인데 중복된걸 삭제할 방법을 모르겠고
[한열만 중복된 데이터 말고 3개열을 합쳐서 비교해야하는데 그런 예제를 못찿겠고]
아무튼 많이 골치 아픈 상황이네요
중복되지 않게 넣는법과
이미 중복해서 들어간 데이터 삭제하는 법좀 알려주세요
Comment 1
-
쓸만한게없네(윤선식)
2014.11.05 21:36
1, 중복되지 않게 넣는 방법은 UNIQUE INDEX 제약조건을 거시면 될 듯 하고요.
http://msdn.microsoft.com/en-us/library/ms188783.aspx
CREATE UNIQUE INDEX IX_Auth_Role_Page
ON [dbo].[Auth_Role_Page]
Role_Id ,Page_Id , com_code
2. 지금 위 내용을 보면 PRIMARY KEY 자체가 없는데 이 세개의 열을 PK로 만드시는 것도 방법입니다.
ALTER TABLE [dbo].[Auth_Role_Page]
ADD CONSTRAINT PK_Auth_Role_Page PRIMARY KEY
(Role_Id ,Page_Id , com_code)
3. 이미 들어간 데이터를 삭제하시려면
- 우선 중복데이터를 찾아서 임시테이블에 넣은 후
- 중복데이터를 삭제하시고
- 임시 테이블에 있는 것을 GROUP BY 절을 사용해서 원본 테이블에 넣으면 되겠네요.
이상입니다.