ASP 테스트를 위해서 내컴에 테스트 계정,테스트디비를 생성하고 디비에 연결할려고 하면..

이따구 에러가 난다..


오류 형식:
Microsoft OLE DB Provider for SQL Server (0x80004005)
'test' 사용자가 로그인하지 못했습니다. 이유: 트러스트된 SQL Server 연결과 관련되지 않았습니다.
/include/db_conn.asp, line 6


결론 부터 말한다면 SQL서버 보안이 윈도우인증만 가능하기 때문..

그래서 결론은 SQL Server 및 윈도우즈로 변경하면 된다는거..


참고 문헌은 http://support.microsoft.com/kb/889615/ko



현상

Microsoft SQL Server 2000 또는 SQL Server 2005에 연결하려고 하면 다음과 같은 오류 메시지가 나타날 수 있습니다.
'<LoginName>' 사용자가 로그인하지 못했습니다. 이유: 트러스트된 SQL Server 연결과 관련되지 않았습니다.

원인

이 문제는 SQL Server 보안 인증이 Windows만으로 설정되어 있고 다음 경우 중 하나에 해당할 경우에 발생합니다.
  • SQL Server 로그인을 사용하여 SQL Server 데이터베이스에 연결하려고 합니다.
  • 트러스트된 SQL Server 연결을 사용하여 Microsoft Windows 98 기반 컴퓨터에 설치되어 있는 SQL Server 2000 Desktop Engine(MSDE 2000이라고도 함) 데이터베이스에 연결하려고 합니다.
  • 서버에 연결할 충분한 사용 권한이 없는 Windows 계정에서 SQL Server 데이터베이스에 연결하려고 합니다.

해결 과정

이 문제를 해결하려면 발생한 현상에 따라 아래의 방법 중 하나를 사용하십시오.
  • SQL Server 로그인


    올바른 Windows 로그인을 사용하여 SQL Server에 연결합니다. SQL Server 로그인을 계속 사용해야 하는 경우에는 SQL Server의 보안 인증 모드를 SQL Server 및 Windows로 변경합니다. 보안 인증 모드를 변경하려면 다음과 같이 하십시오.
    1. 엔터프라이즈 관리자를 시작합니다.
    2. Microsoft SQL Servers를 확장한 다음 SQL Server 그룹을 확장합니다.
    3. SQL Server 및 Windows 인증으로 변경할 서버를 마우스 오른쪽 단추로 누른 다음 등록 정보를 누릅니다.
    4. SQL Server 속성 대화 상자에서 보안 탭을 누르고 SQL Server 및 Windows를 누른 다음 확인을 누릅니다.
    5. SQL Server 서비스를 다시 시작할 것인지 묻는 메시지가 나타나면 를 누릅니다.
    참고 SQL Server 2005를 사용하는 경우 엔터프라이즈 관리자가 아닌 SQL Server Management Studio를 사용하여 보안 인증 모드를 변경합니다.
  • Microsoft Windows 98 기반 컴퓨터에 설치된 SQL Server 2000 Desktop Engine(MSDE 2000)

    SQL Server 2000 Desktop Engine이 Windows 98 기반 컴퓨터에 설치되어 있는 경우 표준 SQL Server 로그인을 사용하여 데이터베이스에 연결해야 합니다. SQL Server 2000 Desktop Engine을 Windows 98에 설치한 경우에는 Windows만 인증 모드가 지원되지 않습니다.
  • 사용 권한이 충분하지 않은 Windows 계정

    이 문제를 해결하려면 SQL Server에 해당 Windows 계정을 추가한 다음 사용자에게 액세스 권한이 필요한 각 데이터베이스에 대한 적절한 사용 권한을 부여해야 합니다. SQL Server 2000에서는 다음과 같이 하십시오.
    1. 엔터프라이즈 관리자를 시작합니다.
    2. Microsoft SQL Servers를 확장한 다음 SQL Server 그룹을 확장합니다.
    3. 해당 서버를 확장한 다음 보안을 확장합니다.
    4. 로그인을 마우스 오른쪽 단추로 누른 다음 새 로그인을 누릅니다.
    5. SQL Server 로그인 속성 대화 상자에서 이름 상자에 해당 Windows 계정 이름을 입력합니다. 도메인 목록에서 이 Windows 계정이 속해 있는 도메인을 선택합니다.
    6. 데이터베이스 액세스 탭을 누르고 클라이언트에 대해 적절한 사용 권한을 설정한 다음 확인을 누릅니다.
    참고 SQL Server 2005를 사용하는 경우 엔터프라이즈 관리자가 아닌 SQL Server Management Studio를 사용하여 보안 인증 모드를 변경합니다.

    참고 계정을 추가한 후 사용자에게 액세스 권한이 필요한 각 데이터베이스에 대한 액세스 권한도 부여해야 합니다.
참고 가능하다면 SQL Server 인증을 Windows만으로 설정하는 것이 좋습니다.

추가 정보

SQL Server 2000의 인증 모드에 대한 자세한 내용을 보려면 다음 MSDN(Microsoft Developer Network) 웹 사이트를 방문하십시오. SQL Server 2000에서 연결 문제를 해결하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
827422  SQL Server 2000에서 연결 문제를 해결하는 방법

'DATABASE' 카테고리의 다른 글

큐브리드 복사 cubrid unloaddb / loaddb  (0) 2018.03.30
MS-SQL 테이블 복사 쿼리  (0) 2011.03.02

로그 데이타같이 단순히 데이타만 누적시키는 테이블에서 

해당 데이타가 있으면 업데이트 

없으면 인서트 하는 로직이 많죠..


asp라면 쉽게 생각하는 방법이

select 문을 써서 eof 면 인서트 eof가 아니면 업데이트 하는 소스를 생각하기 쉽죠..

그런데 구지 select를 해서 recordset에 담아야 할까요? 이런 로직은 디비콜이 2번일수 밖에 없죠.
게다가 select 당시에는 데이타가 없다가 인서트전에 데이타가 들어간경우... 중복데이타가 생기거나 PK오류로 sql에러가 뜨겠죠.. 


9i이후부터는 merge문을 지원합니다.


테스트 테이블 생성

CREATE TABLE TEST_LOG(

LOG_DATE VARCHAR2(10),

TOTAL NUMBER DEFAULT 1

)


merge 문

MERGE INTO TEST_LOG

USING DUAL B 

ON (LOG_DATE = '2011/09/16') 

WHEN MATCHED THEN 

 UPDATE SET TOTAL = TOTAL + 1 

WHEN NOT MATCHED THEN 

 INSERT (LOG_DATE,TOTAL) 

 VALUES ('2011/09/16',1)

;


한번의 콜로 업데이트 또는 인서트를 실행하게 됩니다.


그럼 9i버전 이전은 어떻게...

PL/SQL문을 사용할수 밖에 없겠죠..


UPDATE TEST_LOG

SET  TOTAL = TOTAL + 1

WHERE LOG_DATE = '2011/09/15';

IF SQL%NOTFOUND THEN

INSERT INTO TEST_LOG(LOG_DATE,TOTAL)

VALUES('2011/09/15',1);

END IF;

END;

/


업데이트해봐라 ... 업데이트못했으면 인서트하라는 문구입니다.


디비콜 최소화...

오라클 함수중에 trim,ltrim,rtrim 이 있습니다.

ltrim과 rtrim 함수를 포함한 것이 trim함수라고 생각할수도 있겠지만
정확하게는 그렇지 않습니다.

우선 일반적으로 알고 있는 ltrim,rtrim,trim 에 대한 사용용도 입니다.



select ltrim('aabacdbaeaa' , 'a') from dual;
==>bacdbaeaa

select trim(leading 'a' from 'aabacdbaeaa') from dual;
==>bacdbaeaa



select rtrim('aabacdbaeaa' , 'a') from dual;
==>aabacdbae

select trim(trailing 'a' from 'aabacdbaeaa') from dual;
==>aabacdbae


select trim(both 'a' from 'aabacdbaeaa') from dual; ( = select trim('a' from 'aabacdbaeaa') from dual;)
==>bacdbae


위 쿼리들은 모두 왼쪽이든 오른쪽이든 양쪽이든 'a' 라는 문자를 없애는 쿼리 입니다.

그럼 스페이스를 없애는 쿼리는 ...예 간단하게 'a' 부분을 ' ' 처럼 빈 공간을 넣거나 아니면 
더 간단히 trim source만 입력하면 됩니다.

select trim(both ' ' from ' aabacdbaeaa ') from dual; ( = select trim(' aabacdbaeaa ') from dual;)
==>aabacdbaeaa

select ltrim(' aabacdbaeaa ',' ') from dual; (select ltrim(' aabacdbaeaa ') from dual;)
==>aabacdbaeaa_ (_는 빈 공간입니다.)

select rtrim(' aabacdbaeaa ',' ') from dual; (select rtrim(' aabacdbaeaa ') from dual;)
==>_aabacdbaeaa (_는 빈 공간입니다.)

그럼 trim source 나 trim set 중에 하나가 null 인 경우는 어떤 값을 리턴할까요..
예 바로 null을 리턴합니다.

아래 쿼리 모두 결과값은 'IS NULL' 입니다.

select Nvl( trim('' from 'abc'),'IS NULL') from dual;
select Nvl( trim('a' from ''),'IS NULL') from dual;
select Nvl( trim('' from ''),'IS NULL') from dual;
select Nvl( trim(''),'IS NULL') from dual;
select Nvl( ltrim('abc',''),'IS NULL') from dual;
select Nvl( ltrim('','a'),'IS NULL') from dual;
select Nvl( ltrim('',''),'IS NULL') from dual;
select Nvl( ltrim(''),'IS NULL') from dual;

==> IS NULL

그럼 ltrim,rtrim 과 trim의 결정적인 차이점은 무엇일까요..
바로 trim set 의 글자수 제한입니다.

trim 함수에 적용해 보면 다음과 같은 에러가 납니다.
SQL> select Nvl( trim('abc' from 'abc'),'IS NULL') from dual;
select Nvl( trim('abc' from 'abc'),'IS NULL') from dual
            *
ERROR at line 1:
ORA-30001: trim set should have only one character

only one 이라는 군요..

그럼 ltrim 함수에 적용해 보면 어떨까요.

select Nvl( ltrim('abc','abc'),'IS NULL') from dual;
==> IS NULL

여러문자도 가능하군요..

그럼 아래의 쿼리는 

select Nvl( ltrim('abcbaaaabbbbccccaaabbbccc','abc'),'IS NULL') from dual;
==> IS NULL

baaaabbbbccccaaabbbccc 이 아닌 null이네요..

즉 ltrim,rtrim 의 trim set 은 여러 문자가 가능하고..
여러 문자인 경우는 각각의 하나의 문자가 해당되는경우 없애준다라는 의미입니다.
즉 위 예에서는 왼쪽이 a이거나 b이거나 c면 없앤다..
다시 왼쪽이 a이거나 b이거나 c면 없앤다..
왼쪽이 a이거나 b이거나 c면 없앤다..
이런 작용이 왼쪽 첫 문자가 a도 아니고 b도 아니고 c도 아닐때 까지 작용하는 것입니다.











mssql 테이블 복사 쿼리 입니다.


1. 테이블을 생성하면서 테이블의 데이타 복사


select * into 생성될테이블명 from 원본테이블명


테이블 구조만 복사하겠다면

select * into 생성될테이블명 from 원본테이블명 where 1=2


2. 테이블이 이미 생성되어 있는경우 데이타만 복사


insert into 카피될테이블명 select * from 원본테이블명


특정 데이타만 복사 하겠다면

insert into 카피될테이블명 select * from 원본테이블명 where 검색조건


주의할 점은 테이블 구조만 복사되지 프라이머리키,인덱스등은 복사가 안된다는 점 입니다.

당연한 이야기 인가요..

테스트용 테이블 만들때 유용하게 쓸수 있죠..

CREATE TABLE TEST_MEMBER AS SELECT * FROM MEMBER

 

검색을 걸어서 필요한 데이타만 복사할수도 있죠.

CREATE TABLE TEST_MEMBER AS SELECT * FROM MEMBER WHERE IDX<10000

 

테이블 구조만 복사하고 싶다면..

CREATE TABLE TEST_MEMBER AS SELECT * FROM MEMBER WHERE 1=2

검색조건을 이렇게 한다면 테이타는 복사가 안되겠죠..

 

테이블이 이미 만들어진 경우는

INSERT INTO TEST_MEMBER SELECT * FROM MEMBER


주의할점은 테이블구조만 복사된다는 것이다.

프라이머리키나 인덱스등은 복사가 안돼니 따로 설정해 주어야 한다.

+ Recent posts