관리자
글쓰기

sql2005를 운영하는 분들중에서 이런 메세지를 봤을것이다.
 
Alert창 오류메세지
GUID에는 대시 4개를 사용하여 32개의 자릿수를 사용해야 합니다(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

이유 : Management Stuido(관리도구)와 SQL2005 설치버전이 틀려서 발생하는 오류.

Management Stuido(관리도구) : 도움말 > 정보 클릭
SQL2005 서버 설치버전 : select @@version

저런경우도 있나봅니다.
여튼 서비스팩을 설치를 해서 버전을 맞추면 된다.

SQL서버 설치 버전번호 체크하기

MS는 정말 짜쯩입니다.


2011/04/19 16:13 2011/04/19 16:13

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/368

댓글을 달아 주세요

외래키를 설정하는 이유는 무결성을 채우기 위함입니다.
관계성 있는 테이블들끼리 외래키를 설정을 하면
쓰레기 데이터들이 쌓이지 않겠죠.

* 실습하기 *

create table 시험
(시험번호 int constraint PK_시험_시험번호 primary key, 시험명 char(20))

insert into 시험 values(10, '국어')
insert into 시험 values(20, '영어')
insert into 시험 values(30, '수학')

create table 응시자
(
 번호 int IDENTITY (1,1)
, 이름 char(10)
, 시험번호 int
)

insert into 응시자 values('오버탑', 10)
insert into 응시자 values('오버탑', 20)
insert into 응시자 values('오버탑', 30)
insert into 응시자 values('오버탑', 40)

여기까지 데이터들이 생성되었다가 가정하자

그럼 외래키를 설정해보자

1.T-SQL 에서 생성하기

alter table 응시자
add constraint FK_응시자_시험번호
 foreign key(시험번호) references 시험(시험번호)
-- on update cascade
-- on delete cascade

여기서잠깐??
on update cascade -- 옵션 1
on delete cascade --옵션 2

 cascade : 설정 체크
 no action : 설정 체크해제

 - 에러메세지 -
서버: 메시지 547, 수준 16, 상태 1, 줄 1
ALTER TABLE 문이 COLUMN FOREIGN KEY 제약 조건
'FK_응시자_시험번호'과(와) 충돌되었습니다.
충돌은 'PushUser' 데이터베이스, '시험', column '시험번호'
테이블에서 발생했습니다.

왜 생겼을까여 ??
답 : 참조하는 응시자 테이블의 시험번호중에 참조당하는 시험 테이블에 없어서 생긴다. (시험번호 40)

delete from 응시자 where 시험번호 = 40

삭제 후에 alert 문을 실행하면 외래키가 생성이 된다.

TIP. 제약조건 삭제는

 alter table 응시자
 drop FK_응시자_시험번호


2. EM 에서 생성하기

사용자 삽입 이미지

사용자 삽입 이미지


TIP. 옵션설정.
  파란색 박스 1 : on update cascade -- 옵션 1
  파란색 박스 2 : on delete no action --옵션 2

각 옵션에 따라 테스트 해볼까여??
참조자(응시자자)는 모든 액션이 실행되지만 참조당하는자(시험)은
외래키 제약조건에 오류가 발생합니다.

select * from 시험
select * from 응시자

// 참조자에 해당하는 값이 있을 경우에 수정/삭제하기
-- update 시험 set 시험번호 = 50 where 시험번호 = 10
-- delete from 시험 where 시험번호 = 10
- 에러메세지 -
서버: 메시지 547, 수준 16, 상태 1, 줄 1
UPDATE 문이 COLUMN REFERENCE 제약 조건 'FK_응시자_시험'과(와)
충돌되었습니다. 충돌은 'PushUser' 데이터베이스, '응시자', column
'시험번호' 테이블에서 발생했습니다. 문이 종료되었습니다.

// 참조자에 해당하는 값이 없을 경우에 수정/삭제하기

delete from 응시자 where 시험번호 = 30

update 시험 set 시험번호 = 300 where 시험번호 = 30
 - 정상업데이트
select * from 시험

delete from 시험 where 시험번호 = 300
 - 정상삭제

참조자는 언제든지 수정/업데이트가 가능하다.
update 응시자 set 시험번호 = 10 where 시험번호 = 20

// 참조당하는자(시험)를 수정, 삭제가 가능하게 하려면 옵션을 추가하면 된다.

제약조건을 삭제하고 재 설정을 한다.

 alter table 응시자
 drop FK_응시자_시험

 alter table 응시자
 add constraint FK_응시자_시험번호
  foreign key(시험번호) references 시험(시험번호)
  on update cascade
  on delete cascade

select * from 시험
select * from 응시자

update 시험 set 시험번호 = 100  where 시험번호 = 10

select * from 시험
select * from 응시자

시험테이블과 응시자테이블의 시험번호가 동시에 바뀐다. 확인하셨나여 ?

delete 시험 where 시험번호 = 100
select * from 시험
select * from 응시자

이상 옵션에 따라 참조가의 데이터값들의 변화를 알아봤습니다.

결론. 외래키는 데이터 무결성을 위함입니다. DB모델링시 필요한
부분들은 미리 설정을 하셔서 최적화된 데이터를 이용하시면 좋을 것같으네여.


2011/04/08 17:10 2011/04/08 17:10

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/365

댓글을 달아 주세요

DB관리자들이 한번쯤은 경험을 했을 것이다.
순간 깜짝 놀랬을 것이다.

유지관리계획으로 작성을 하면 JOB에이전트에 일정이 자동 추가가 된다.
이때 유지관리계획을 삭제한 후에 JOB에이전트를 삭제할때 아래와 같이 오류가 발생한다.

DELETE 문이 REFERENCE 제약 조건 "FK_subplan_job_id"과(와) 충돌했습니다.
데이터베이스 "msdb", 테이블 "dbo.sysmaintplan_subplans", column 'job_id'에서 충돌이 발생했습니다.
문이 종료되었습니다. (Microsoft SQL Server, 오류: 547)

원인 : sysmaintplan_plans 테이블의 ID값과, 해당 계획의 로그가 쌓이는 sysmaintplan_log의 ID값이 서로 다르기 때문에 발생함.
그러나 sysmaintplan_log의 레코드가  없는경우에 sysmaintplan_plans 의 레코드만 경우도 있다.

위 오류는 아래와 같이 처리가 가능하다.

1.  select * from msdb.dbo.sysmaintplan_subplans 실행하면 레코드가 보인다.
2.  select * from  msdb.dbo.sysmaintplan_log 실행해서 위 레코드ID와 비교를 한다.
문제되는 plan_id 를 아래와 같이 삭제해준다.
delete from msdb.dbo.sysmaintplan_log where plan_id='7C1DDE2F-3FE4-424D-8140-94A4F9AF160B'

단, log 테이블에 아무레코드도 없는 경우가 있을 경우에는 2단계를 패스한다.

3. delete from msdb.dbo.sysmaintplan_subplans where subplan_name = '하위 계획'
해당하는 plan_id or subplan_name 의 조건으로 삭제한다.

4. Job 에이전트를 새로고침 해면 삭제가 된다.
   단, 삭제가 안되는 경우에는 [작업]의 [삭제] 수동으로 지워준다.

그럼 정상적으로 해당 에이전트 JOB 을 삭제할수 있다.



2011/03/29 11:45 2011/03/29 11:45

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/361

댓글을 달아 주세요

테이블을 생성할때 보통은 Unique 필드를 만든다. 또한 증가(시드)를 1로 설정을 해서
생성하는게 기본이다.

하지만 고유값을 복수필드를 선언하면 어떻게 될까?

2개 필드를 아래와 같이 인덱스를 만들어보자

PK_index nonclustered, unique located on PRIMARY goodReg_id, serviceCode

goodReg_id, serviceCode의 2개 필드에 고유값(PK)을 설정한 내용이다.
실제 데이터를 입력을 했을시 각각의 중복키가 발생하는게 아니고
2개의 필드가 동시에 중복일 경우에만 PK가 성립이 된다.

2개의 필드의 값을 똑같은 값으로 했을 경우에는 아래와 같이 PK 중복에러가 생긴다.

고유 인덱스 'PK_index'이(가) 있는 'tbl_test' 개체에 중복 키 행을 삽입할 수 없습니다.
문이 종료되었습니다.

데이터 입력시 주의하면 좋겠다.


2011/03/24 11:19 2011/03/24 11:19

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/357

댓글을 달아 주세요

이 글은 구글링하다가 찾은 블로그포스팅에서 (http://blog.naver.com/csaiur/10083788708)
배운대로 연동한 내용입니다.


CKEditor™ 는 FCKeditor 2.x 의 버전업된 웹 에디터입니다.
그동안 FCKeditor 2.x 웹에디터를 asp.net 에서 많이들 사용하고 있죠.

2가지를 모두 적용해봤는데 [CKEditor™] 에디터가 조금은 편하더군요.
다양한 기능을 써보지는 않았지만 기능적으로는 비슷한것 같아요.

그냥 편하신걸로 쓰시면 될것 같아요.

CKEditor™ 를 적용해봅시다.

1. 다운로드 한다.
 - CKEditor™ 다운로드
 - CKFinder™ 다운로드 

2. 각각 압축을 풀면 아래와 같이 파일들이 존재합니다.

사용자 삽입 이미지

사용자 삽입 이미지

이렇게 보일겁니다.
여기서 ckeditor 의 파일들중에서 asp.php, html 은 깔끔하게 지워주세요.
쓰이지 않는 파일들은 가지고 갈 필요가 없겠죠.

현재 작업중은 프로젝트에 2개의 폴더를 추가하시면 됩니다.
wwwroot/ckeditor
wwwroot/ckfinder
이렇게 넣어도 되지만 폴더가 지져분해 보여서 저는
wwwroot/include/ckeditor
wwwroot/include/ckfinder
이렇게 구성했습니다.

프로젝트에 추가하는 법을 모르시면 Solution Explorer 에서
include 폴더를 한개 생성한 후에 2개의 폴더를 각각 드래그해서
넣어주시면 됩니다. 참 쉬죠잉~~

일단은 wwwroot/include/ckeditor 폴더만 먼저 복사해주세요.


3. 웹폼에 적용해 봅시다.
쓰기 폼 파일인 write.aspx 으로 생성하고
상단에 스크립트를 적용하시고
본문이 들어가는 공간에 아래를 넣어주시면 됩니다.



이렇게 넣어주시고 write.aspx 를 실행하면 웹에디터가 적용됩니다.
확인 하셨나여 ??
짠~~ 하고 잘 뜨죠 ??

4. ckfinder 폴더를 웹프로젝트에 추가해주세요 (드래그 하세요. ㅋㅋ)
5. 업로드 기능을 사용할 수 있도록 설정해줍니다.
 - ckfinder\bin\Release폴더에 있는 [ CKFinder.dll ] 파일을 웹프로젝트의
    bin 폴더에 추가해준다.
    단, 작업중인 프로젝트사 웹사이트가 아니고 프로젝트로 구성했을시에는
    bin 폴더가 없습니다. 그래서 이넘도 드래그해서 가져와야 됩니다. ㅠㅠ
    다른 방법은 아직 몰라요. 초보라서
 - ckfinder\_source , ckfinder\bin 폴더는 삭제해준다.
    방금 bin에 추가한 dll 과 충돌되는 현상이 종종 있다고 하네여.

 - 파일업로드할 폴더를 생성한다.
   \include\data\ckfinder\ 폴더를 생성해준다.
   혹 업로드시 권한 문제가 있을 경우 IIS설정에서 해당 폴더에 쓰기권한을 주시면됩니다.

  - ckfinder/config.aspx 설정 변경하기
    public override void SetConfig(){
     ....
      // The base URL used to reach files in CKFinder through the browser.
      BaseUrl = "/include/data/ckfinder/";   
     ....
    }

     public override bool CheckAuthentication()
     {
     return true;
     }


   - 마지막 스크립트 소스를 수정해준다.





  



여기까지 하시면 이미지업로드 기능이 생성이 됩니다.
확인해보세요. 여기서 이미지업로드 기능이란 웹에디터 본문에 이미지 삽입시키는
기능입니다. 일단 글쓰기시 파일업로드 기능도 가능할 것 같은데
좀더 찾아보면 되지 않을까 합니다. 이 기능은 다음 기회에 포스팅 해볼께요.

6. 웹에디터의 세부 기능들을 스크립트로 설정이 가능합니다.




이렇게 하시면 끝납니다.
어떠세요? 아직 저도 초보라서 쉽게 설명을 못드렸네여.
좀더 쉬운 방법이 있으면 다시 포스팅하겠습니다.


2010/06/15 10:02 2010/06/15 10:02

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/345

댓글을 달아 주세요

연결된 서버(linked server)로 분산쿼리를 실행하려고 하면 아래와 같은 에러메세지가
나타납니다.

연결된 서버 "연결서버이름(xxxx)"의 OLE DB 공급자 "SQLNCLI"이(가) 메시지 "지정되지 않은 오류입니다."을(를) 반환했습니다.
연결된 서버 "연결서버이름(xxxx)"의 OLE DB 공급자 "SQLNCLI"이(가) 메시지 "이 작업을 완료하는 데 필요한 저장 프로시저가 서버에 없습니다. 시스템 관리자에게 문의하십시오."을(를) 반환했습니다.
메시지 7311, 수준 16, 상태 2, 줄 1
연결된 서버 "연결서버이름(xxxx)"에 대한 OLE DB 공급자 "SQLNCLI"의 스키마 행 집합 "DBSCHEMA_TABLES_INFO"을(를) 가져올 수 없습니다. 공급자가 인터페이스를 지원하지만 이 인터페이스를 사용하면 오류 코드가 반환됩니다.



원인.
이 문제는 시스템 저장 프로시저가 업그레이드되지 않았기 때문에 발생합니다. SQL Server 2000 SP3 또는 SQL Server 2000 SP4를 설치한 후 시스템 저장 프로시저를 수동으로 업그레이드해야 합니다.

해결방법.
하나. Instcat.sql 스크립트를 수동으로 실행하기
1.  Windows 인증 모드를 사용하여 시스템 저장 프로시저를 업그레이드하려면
실행 > cmd > 아래 명령어 실행
   osql -E -S <LinkedServerName> -i <Location>\instcat.sql
2.  SQL Server 인증 모드를 사용하여 시스템 저장 프로시저를 업그레이드하려면
   osql -U <AdminLogin> -P <AdminPassword> -S <LinkedServerName>
           -i <Location>\instcat.sql

위 방법은 아래에서 간단하게 긁어옴
http://support.microsoft.com/kb/906954/ko

그런데 위 실행은 안해봤습니다. 서비스를 하고 있는 DB서버라서 혹시나 문제가
발생할까봐 못해봤습니다. ㅠㅠ


또 하나. 시스템프로시저 추가해주기
결국 한개의 프로시저만 있으면 간단하게 해결해주네여.


use master
Go
create procedure sp_tables_info_rowset_64
      @table_name sysname,
      @table_schema     sysname = null,  
      @table_type nvarchar(255) = null
as
declare @Result int set @Result = 0
exec @Result = sp_tables_info_rowset @table_name, @table_schema, @table_type

위 프로시저만 한개 생성해주면 잘 됩니다.

생성을 하고 분산쿼리를 실행했떠니 아래와 같이 에러메세지가 나오면

연결된 서버 "연결서버이름(xxxx)"의 OLE DB 공급자 "SQLNCLI"이(가) 메시지 "지정되지 않은 오류입니다."을(를) 반환했습니다.
메시지 229, 수준 14, 상태 5, 프로시저 sp_tables_info_rowset_64, 줄 7
'dbo' 소유자, 'master' 데이터베이스, 'sp_tables_info_rowset_64' 개체에 대한 EXECUTE 사용 권한이 거부되었습니다.

실행권한을 줘야 실행이 되는군요.
아래와 같이 public EXEC  권한을 체크해줘야 합니다.
사용자 삽입 이미지


2010/04/30 15:58 2010/04/30 15:58

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/336

댓글을 달아 주세요

MSSQL2008 Management Studio를 사용하는 개발자들에게 팁을 하나 주려고 포스팅합니다.
테이블을 생성하고 수정시 이런 경고메세지로 인해서 수정을 못하는 분들이 있을겁니다.

변경 내용을 저장 할수 없습니다. 변경 내뇽을 적용하려면 다음 테이블을
삭제 하고 다시 만들어야 합니다. 다시 만들 수 없는 테이블을 변경
했거나 [테이블을 다시 만들어야 하는 변경 내용 저장 사용 안함 ] 옵션을
설정 했습니다.

MSSQL2008 Management Studio 제약을 걸어놓았더군요. ms에서 왜 그런지는
잘 모르겠구요. 해결 방법은 아래와 같이 해주시면 됩니다.
Management Studio > 도구 > 옵션 > <테이블을 다시 만들어야 하는 변경 내용 저장 사용 안함>
항목을 체크해제 해주시면 됩니다. 아주 간단하죠.

사용자 삽입 이미지

옵션 : 테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함
테이블을 다시 만들어야 하는 변경 내용을 사용자가 저장할 수 없게 만듭니다.
다음 동작을 수행하려면 테이블을 다시 만들어야 할 수 있습니다.
1. 테이블의 중간에 새 열 추가
2. 열 삭제
3. 열의 Null 허용 여부 변경
4. 열의 순서 변경
5. 열의 데이터 형식 변경
위 경우에 옵션을 제한하네요..

기타 옵션은 아래 링크에서 확인하세요.
http://msdn.microsoft.com/ko-kr/library/ms188490.aspx

Comment). 구글링에서도 검색이 많았나봅니다. 개발자로써 아주 불편한 사항이거든요.
자동검색어에 추가가 되었더군요. 얼마나 검색을 했으면
MS에서도 다음 개발시 참고해서 불편함이 없었으면 좋겠네여.
사용자 삽입 이미지


2010/04/26 12:00 2010/04/26 12:00

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/335

댓글을 달아 주세요

  1. 검색맨 2010/12/21 12:11  댓글주소  수정/삭제  댓글쓰기

    검색하길잘했어요.. ㅠ
    다 불편해하는군요

  2. 감사맨 2011/03/04 09:53  댓글주소  수정/삭제  댓글쓰기

    이런 옵션이 있었군요~

    감사합니다~

저장프로시저를 생성하는 중에 연결된서버와의 통신이 빈번히 일어날겁니다.

Select, Insert, Update 처럼 쿼리를 실행할경우에는
SELECT * FROM [연결서버이름].[연결db].[권한계정].테이블
ex) SELECT * FROM AddName.DBName.dbo.테이블
하면 쉽게 결과를 얻을 수 있습니다.

하지만 저장프로시저를 실행할 경우에는
아래와 같은 에러메세지를 볼 수 있습니다.

서버 'AddName'이(가) RPC에 대해 구성되지 않았습니다.

여기서 RPC를 이해하시면 됩니다.
RPC = Remote Procedure Call
이것을 해결하는 방법은 아래와 같습니다. RPC옵션을 TRUE 로 처리하면 끝납니다.

EXEC sp_serveroption '연결서버이름', 'rpc', TRUE
  -- 연결된서버로부터 로컬서버로의 RPC 호출을 활성화
EXEC sp_serveroption '연결서버이름', 'rpc out', TRUE
  -- 로컬서버로부터 연결된서버로의 RPC 호출을 활성화

또는 EM or Management Studio 의 툴에서 직접 설정을 해주시면됩니다.

사용자 삽입 이미지


설정 후에 저장프로시저를 실행하면 결과를 얻을 수 있습니다.

Exec 연결된서버이름.DB이름.권한계정.StoredProcedure문

도움이 되시길..

2010/04/21 15:56 2010/04/21 15:56

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/334

댓글을 달아 주세요

  1. 조성구 2010/06/29 17:18  댓글주소  수정/삭제  댓글쓰기

    감사합니다~

    mssql 초보인데 잘보고 가요~

까먹을까봐 올렸습니다.

select convert(varchar, cast('612212375' as money), 1)
select Replace(convert(varchar, cast('612212375' as money), 1), '.00', '')

쿼리를 날릴때 세자리로 끊어서 불러오고 싶을때 쓰면 될듯하다.
왜 저렇게 나오는지는 잘 모르겠다.
쩝.~
2010/04/11 00:26 2010/04/11 00:26
TAG ,

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/326

댓글을 달아 주세요

SQL백업서버를 만들때 DB들은 백업/복원을 하면 쉽게 옮길수 있습니다.
그러나 SQL Server 에이전트를 수동으로 작업하시는 분들이 있을것 같아서 포스팅합니다.

SQL에서는 모든 정보를 스크립팅을 할 수 있습니다.
DB, 테이블(Table)등을 스크립트를 이용해서 생성도 가능하죠
또, JOB Agent도 스크립트를 생성한 후 다른 서버에 생성 할 수 있습니다.

SQL 2000, 2005 모두 가능하지만 조금은 틀리네요.
SQL2000 은 에이전트 전체를 스크립팅 할 수 있지만
SQL2005에서는 각각 작업별로 스크립팅을 할 수 있습니다.

* MSSQL2000 에서 에이전트 작업 스크립트로(T-SQL)로 생성하기

사용자 삽입 이미지

사용자 삽입 이미지



* MSSQL2005 에서 에이전트 작업 스크립트로(T-SQL)로 생성하기

사용자 삽입 이미지

위 처럼 하시면 쉽게 SQL Server 에이전트 작업스케즐링도 복사가 가능합니다.
백업서버를 생성하시는 분들에게 도움이 되시길 바랍니다.

-  당신의 지금은 이미 과거일뿐이다. -
2010 Catch Phrase By 오버탑
2010/04/01 17:22 2010/04/01 17:22

트랙백 주소 :: http://www.overtop.co.kr/tt2/trackback/322

댓글을 달아 주세요