연결된서버 사용하기 (linked server)

Posted by 나에요임마
2017. 12. 24. 01:38 Program/MSSQL


 

 - MSSQL 연결된 서버란?

 

   MSSQL 은 연결된서버 기능을 제공하는데 이를 이용하면 다른 네트워크의 데이터베이스를 원격으로 접속하여

   사용할 수 있도록 해줍니다.



 - MSSQL 연결된 서버 생성

 

   EXEC sp_addlinkedserver

      @server = '[연결된 서버별칭]',

      @srvproduct = '',

      @provider = 'SQLOLEDB',

      @datasrc = '[서버 아이피]',

      @catalog = '[데이터 베이스명]'

 

 - MSSQL 연결계정 생성

 

   EXEC sp_addlinkedsrvlogin

      @rmtsrvname= '[연결된 서버별칭]',

      @useself= 'false',

      @rmtuser = '[사용자 이름]',

      @rmtpassword = '[사용자 암호]'

 



 - MSSQL 연결된 서버 확인

 

   SELECT FROM master.dbo.sysservers WHERE srvname = '[연결된 서버별칭]'

 

 

 - MSSQL 연결계정 확인

 

   SELECT FROM master.sys.linked_logins WHERE remote_name = '[사용자 이름]'

 



 - MSSQL 연결된 서버 이용방법

 

   연결된 서버를 등록한 후 사용하려면 [연결된 서버별칭].[데이터 베이스명].[데이터베이스 소유자명].[테이블명]

   형태로 호출하여 사용할 수 있습니다.

   SELECT 쿼리를 예로 들면 아래와 같습니다.

 


 - MSSQL 일반서버에 SELECT 쿼리시

 

​   SELECT [컬럼명] FROM [테이블명] WHERE [조건절]

 

 - MSSQL 연결된 서버에 SELECT 쿼리시

 

​   SELECT [컬럼명] FROM [연결된 서버별칭].[데이터 베이스명].[데이터베이스 소유자명].[테이블명] WHERE [조건절]




 - MSSQL 연결된 서버 삭제

 

   EXEC sp_dropserver

      @server = '[연결된 서버별칭]'

 

 - MSSQL 연결계정 삭제

 

   EXEC sp_droplinkedsrvlogin

      @rmtsrvname= '[연결된 서버별칭]',

      @locallogin = NULL


 [참고사항] 연결된 서버 삭제

 

   연결된 서버를 삭제하기 위해서는 sp_droplinkedsrvlogin 을 이용하여 연결계정을 먼저 삭제하고

   sp_dropserver 를 이용하여 연결된 서버를 삭제하여야 합니다.

 



 

 - 예제 1

 

   아래와 같은 정보를 갖는 연결된 서버를 생성하시오.

 

 

항목

상세 내용

연결된 서버별칭

linkedserver

서버 아이피

192.168.1.3

데이터 베이스명

test

사용자 이름

id

사용자 암호

password


 예제 1 쿼리

 

   EXEC sp_addlinkedserver

      @server = 'linkedserver',

      @srvproduct = '',

      @provider = 'SQLOLEDB',

      @datasrc = '192.168.1.3',

      @catalog = 'test'


   EXEC sp_addlinkedsrvlogin

      @rmtsrvname= 'linkedserver',

      @useself= 'false',

      @rmtuser = 'id',

      @rmtpassword = 'password'

 

 

 - 예제 2

 

   예제1에서 생성한 연결된 서버와 연결계정을 확인하시오.

 

 

 - 예제 2 연결된 서버 생성여부 확인

 

   SELECT FROM master.dbo.sysservers WHERE srvname = 'linkedserver'

 


srvid

srvstatus

srvname

1

1184

linkedserver


 - 예제 2 연결계정 생성여부 확인

 

   SELECT FROM master.sys.linked_logins WHERE remote_name = 'id'

 


server_id

local_principal_id

uses_self_credential

remote_name

modify_date

1

0

0

id

2015-03-22 16:11:41.637


srvid

srvstatus

srvname

1

1184

linkedserver


 - 예제 3

 

   예제1에서 생성한 연결된 서버를 이용하여 아래와 같은 테이블의 내용을 조회하시오.

 


 - 192.168.1.3 서버 test.dbo.성적 테이블

일련번호

이름

점수

1

홍길동

90

2

일지매

95

3

임꺽정

85


 - 예제 3 쿼리

 

   SELECT 일련번호이름점수 FROM linkedserver.test.dbo.성적

 

일련번호

이름

점수

1

홍길동

90

2

일지매

95

3

임꺽정

85


 - 예제 4

 

   예제1에서 생성한 연결된 서버와 연결계정을 삭제하시오.

 

 

 - 예제 4 쿼리

 

   EXEC sp_droplinkedsrvlogin

      @rmtsrvname= 'linkedserver',

      @locallogin = NULL


   EXEC sp_dropserver

      @server = 'linkedserver'


공유폴더 암호걸기

Posted by 나에요임마
2017. 12. 24. 01:36 Program/Windows

네트워크 공유폴더를 사용하다보면 같은 네트워크 상에 여러 컴퓨터가 연결되어 있는 경우가 많다. 암호 없이 이런 공유를 할 경우 내가 공유해 놓은 폴더를 누구나 볼 수 있고, 알 수 없는 누군가가 파일을 지우거나 수정할 수도 있다는 치명적인 단점이 생긴다. 특정 사람하고만 폴더나 파일을 공유하고 싶은데, 관계도 없는 사람이 와서 다 열어볼 수 있다는 얘기다. 그래서 특정 사용자만 접근 혹은 접속 가능하게끔 하는 방법을 찾았는데...거의 대부분 불특정 다수에게 다 공개하는 방법만 있거나, 사용자 계정과 암호를 설정했는데 다른 컴퓨터에 접속시도를 하면 폴더 액세스가 거부되었습니다. 네트워크 관리자에게 문의하세요. 라는 메시지만 볼 수 있었다.  


저런 메세지가 뜨는 이유가 왜 인지 이유를 모르겠어서 무식하게 설정 변경해가며 테스트 해보는 삽질 끝에 특정 사용자만 접속 가능한 방법을 찾았다. 아래의 방법으로 계정을 여러개 추가해서 각기 다른 권한을 주면 A한테는 파일 추가나 수정권한까지 주고, B는 파일을 읽기만 할 수 있게끔 할 수 있다. 또 C는 폴더 내용을 볼 수 없게 끔도 할 수 있다.



 사용자 계정 추가하기


특정 사용자에게만 폴더를 공유하기 위해서는 사용자 계정을 따로 추가해야 한다. 각 사용자마다 공유 폴더가 다를 수 있고, 폴더에 대한 접근권한도 다르게 해야 하기 때문이다. 사용자 계정을 추가하는 방법은 다음과 같다.


1. 제어판에 들어가서 사용자 계정을 클릭한다.


2. 현재 사용 중인 계정에 대한 내용이 뜨는데, 여기서 다른 계정 관리를 눌러준다.


3. 컴퓨터에 저장된 계정들의 내역이 뜬다. 하단의 새 계정 만들기를 눌러준다.


4. 새로 추가할 계정의 이름을 지정하고 표준 사용자를 선택 후, 계정 만들기를 클릭한다.


5. 계정이 생성되면, 암호를 설정해 준다. 이 암호는 공유폴더에 접속하게끔 할 상대에게 알려주어야 하므로, 평소의 자기 비번과는 다른 것으로 설정한다.


6. 제어판- 네트워크 및 공유센터에서 창 좌측의 "고급 공유 설정 변경"을 클릭해서 아래와 같이 설정을 바꿔준다.





 공유 폴더 권한 설정하기

1. 사용자 계정 추가가 끝났으면 공유할 폴더의 권한을 설정해야 한다. 공유할 폴더의 속성을 열어서 공유탭의 '고급 공유' 메뉴를 눌러준다.


2. 고급 공유에서 '선택한 폴더 공유' 메뉴를 체크해 주고 '권한'을 눌러 준다.


3. 권한을 누르면 현재 선택한 폴더에 추가된 사용자 계정들 목록이 뜨는데 Everyone 계정을 선택해서 제거해준다. (Everyone 계정이 추가되어 있으면 아무나 다 접속 할 수 있기 때문에 지워주는 것이다.) 


4. Everyone을 지웠으면 추가 버튼을 눌러서 조금 전에 추가한 사용자 계정을 추가해 주어야 한다. 계정 이름을 입력하고 확인을 눌러준다.


5. 추가 후에, 권한내용에 변경 및 읽기를 체크하고 확인을 눌러준다.


6. 보안 탭을 선택해서 그룹 또는 사용자 이름을 편집해서 원하는 권한을 부여해야 한다. 여기서 권한을 설정하는 내용에 따라서 폴더에 접근을 못하게 할 수도 있고, 읽기만 하게끔 할 수도 있고, 파일생성이나 삭제까지 가능하게 할 수도 있다.

중간에 있는 편집 버튼을 눌러준다.


7. 허가된 사용자들만 남기고 다 지워준 뒤, 추가 버튼을 눌러준다.


8. 위에서 추가한 사용자 계정 이름을 입력하고 확인을 눌러준다.


9. 추가된 사용자 계정을 선택하고 하단의 사용 권한에 자신이 원하는 권한만 체크하고 확인을 눌러주면 특정 사용자에 대한 폴더 공유가 끝난다. 

사용권한 메뉴를 보면 수정, 읽기 및 실행, 폴더 내용 보기, 읽기, 쓰기 등이 존재 하는데 폴더의 내용을 타인이 변경하거나 삭제 하지 못하게 하려면 수정 권한을 체크해제 해 준다. 내용을 변경하거나 다른 파일을 올릴 수 있게 하려면 수정 권한에도 체크를 해주면 된다.





 접속하는 컴퓨터에서 계정정보 설정하기

탐색기의 네트워크에서 해당 PC를 선택하고 접속시도하면 아이디와 암호 확인 창이 뜨는데 만약 그렇게 창이 뜬다면 권한을 부여한 사용자 계정 아이디와 비밀번호를 입력하면 공유 폴더에 접속이 가능하다.

하지만 내 경우는 그런 비밀번호 창이 뜨지 않고 접속 권한이 없다는 알림창만 주구장창 떴다. 이럴 때는 제어판의 자격 증명 관리자에 Windows 자격 증명을 추가해 주면 된다. 추가 방법은 아래와 같다.


아래의 내용은 우선 공유되는 컴퓨터가 아닌, 접속을 시도하려는 컴퓨터에서 해야 하는 일이다.


1. 제어판의 자격 증명 관리자를 실행한다.


2, Windows 자격 증명 추가 버튼을 눌러준다.


3. 위에서 추가한 사용자 계정의 정보를 입력한다. 인터넷 또는 네트워크 주소에는 같은 네트워크에 있기 때문에 \\접속하려는 컴퓨터의 이름 을 적어준다. 내 경우는 CASKER-PC 로 설정되어 있으므로 아래와 같이 적어줬다. 권한을 부여한 계정의 이름과 암호를 입력하고 확인을 누르면 모든 작업이 끝난다. 


인터넷 또는 네트워크 주소에 입력할 컴퓨터 이름은 공유되고 있는 컴퓨터에서 네트워크 및 공유 센터에서 보면 확인 할 수 있다. 


이제 네트워크 내역에서 폴더들에 접속해 보면 설정해 준 권한대로 폴더 접근이 가능한 것을 확인할 수 있다. 만약 제대로 접근이 안된다면 공유되는 컴퓨터를 한번 재부팅 하면 제대로 공유가 될 것이다.

MSSQL DB 관리 쿼리들

Posted by 나에요임마
2017. 12. 20. 01:39 Program/MSSQL
-- ■■DBA의 정기적/일상적 업무
-- 1. 백업과 로그의 관리
-- 2. 인덱스 리빌드
-- 3. DBCC (DB 오류점검)
-- 4. 새로운 사용자 등록, 권한 부여
-- 5. UPDATE STATISTICS - 분포 페이지의 갱신
-- 6. 불필요한 로그 파일들의 삭제

-- ■■DB 정보 확인
EXEC SP_HELPDB     -- 디비 관련 정보 확인 SP
SELECT DATABASEPROPERTYEX('DB명', 'RECOVERY') -- 해당 디비 복구 모델 확인
ALTER DATABASE [DB명] SET RECOVERY SIMPLE  -- 해당 디비 복구 모델 변경 (SIMPLE / FULL)
EXEC SP_HELPINDEX [테이블명]    -- 해당 테이블 인덱스 정보 확인
SELECT @@CONNECTIONS    -- 커넥션 수 확인?
EXEC SP_WHO      -- 커넥션 정보 확인
DBCC LOGINFO      -- 모든 로그 크기 및 정보 확인
EXEC SP_HELPCONSTRAINT [테이블명]   --해당 테이블의 제약 정보 확인

-- ■■DB 의 존재 유무에 따라 삭제하는 구문
IF EXISTS ( SELECT name
  FROM master.dbo.sysdatabases 
  WHERE name = 'DB명' )
BEGIN
ALTER DATABASE [DB명] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [DB명]
END
GO      -- 디비 삭제

  --// 로그 추가 및 [옵션]실제 최소 크기 및 최대치(MAXSIZE)를 변경한다. (FILEGROWTH : 증가치 설정)
ALTER DATABASE [DB명]
ADD LOG FILE(
NAME     = '[FILENAME]',
FILENAME   = '[PATH]\[FILENAME]',
SIZE      = 10MB,
MAXSIZE   = 20MB,
FILEGROWTH = 10%   
)

ALTER DATABASE Database_Name
MODIFY FILE (
NAME = Database_Name_LOG,
SIZE = 2 MB )
GO



-- ■■DB 테이블 컬럼 모두 보기
SELECT TABLE_NAME, 
COLUMN_NAME,columnproperty(OBJECT_ID(TABLE_NAME),
COLUMN_NAME, 'IsIdentity') as IsIdentity,
ORDINAL_POSITION, IS_NULLABLE, DATA_TYPE, 
CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, COLLATION_NAME, 
CHARACTER_SET_NAME 
FROM 
INFORMATION_SCHEMA.COLUMNS 
-- WHERE TABLE_NAME = '테이블명'
ORDER BY TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME

-- ■■함수 관련
ROUND(숫자, 몇번째자리까지남길건지, 음수이면반올림/나머지버림)

--관리도구에서 성능면에가면 시스템 모니터를 할 수 있음
-- ■■프로파일러 관련
DBCC DROPCLEANBUFFERS    -- 프로파일러 쿼리 듀레이션 체크 중 캐시 삭제

-- ■■SET OPTION 관련
SET NOCOUNT ON     -- 쿼리실행시 나오는 카운트수 끔
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED -- 락없이 읽기 가능 옵션
ALTER DATABASE [DB명] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE -- DB 모드 변경
ALTER DATABASE [DB명] SET  MULTI_USER    -- 기본 모드

-- ■■TABLE COLUMN 추가 수정 삭제
ALTER TABLE [테이블명] ADD [추가할컬럼명] [속성]
-- 추가할 때는 NULLABLE이나 DEFAULT 값이 정해져있는 것만 가능함
ALTER TABLE [테이블명] ALTER COLUMN [컬렴명] [변경할 속성]
EXEC SP_RENAME '테이블명.[수정할컬럼명]', '수정될이름', 'COLUMN'
ALTER TABLE [테이블명] DROP COLUMN [삭제할컬럼명]




-- ■■INDEX 추가 :: INCLUDE OPTION은 2000에는 적용 안됨,
--  :: INDEX WIZARD RECOMMEND INDEX -> MILES_LOG 은 안해도됨
CREATE NONCLUSTERED INDEX IX01_MEM_INF
ON [dbo].[MEM_INF] ([MEM_SQUAD])
INCLUDE ([MEM_CD])

CREATE NONCLUSTERED INDEX IX02_MEM_INF
ON [dbo].[MEM_INF] ([COMPANY_INF_CD])
INCLUDE ([MEM_CD],[MEM_SRL_NUM],[MEM_CLASS],[MEM_NAME])

CREATE NONCLUSTERED INDEX [IX03_MEM_INF]
ON [dbo].[MEM_INF] ([ANNU_SCHEDUL_CD])

--------------------------------------------------------------------
-- ■■DB로그 축소
-- 2003버전

SELECT * FROM ::fn_dblog(default, default) -- LOG 내용 확인
DBCC SQLPERF(LOGSPACE)  -- 모든 DB 이름, 로그사이즈, 사용률, 상태 확인 
BACKUP LOG [DB명] WITH NO_LOG -- 로그 내용 지우기 (옵션 NO_LOG)
SP_HELPDB [DB명]   -- 대상 파일 이름 확인
DBCC SHRINKFILE([DB로그파일명], 5, TRUNCATEONLY) -- 5메가까지 축소
DBCC SHRINKFILE('DB로그파일명', 1)   -- 같은내용

-- 2008버전

TRUNCATE_ONLY 옵션은 2008 버전부턴 사용되지 않습니다
로그를 비정상적으로 지우기 보다 제대로 사용하라는 의미인지 모르겠습니다
암튼 트랜잭션 로그의 올바른(?) 처치 방법은 두가지 인거 같네요

1. 데이터베이스 복구모델을 simple
ALTER DATABASE [DB명] SET RECOVERY SIMPLE
GO

DBCC SHRINKFILE([DB명], 1)
GO

ALTER DATABASE [DB명] SET RECOVERY FULL
GO

2. 트랜잭션 로그를 백업하고 로그파일 크기를 줄인다.
Backup log MILES to disk='c:\log_backup01.trn'
GO

DBCC SHRINKFILE('DB로그파일명', 2)
GO

이런 과정을 거쳐도 안줄어 드는 경우 한 번 더 반복하면 됩니다

--■■ 2008로그축소 버전2
------------------------------------------------------------------------------
-- Otto R. Radke - http://ottoradke.com
-- Info: T-SQL script to shrink a database's transaction log. Just set the
-- database name below and run the script and it will shrink the
-- transaction log.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
-- Update the line below with the name of the database who's transaction
-- log you want to shrink.
------------------------------------------------------------------------------
USE YourDatabaseName
------------------------------------------------------------------------------
-- Don't change anything below this line.
------------------------------------------------------------------------------
GO
-- Declare variables
DECLARE @SqlStatement as nvarchar(max)
DECLARE @LogFileLogicalName as sysname
-- Alter the database to simple recovery
SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY SIMPLE'
EXEC ( @SqlStatement )
-- Make sure it has been altered
SELECT [name], [recovery_model_desc] FROM sys.databases WHERE [name] = DB_NAME()
-- Set the log file name variable
SELECT @LogFileLogicalName = [Name] FROM sys.database_files WHERE type = 1
-- Shrink the logfile
DBCC Shrinkfile(@LogFileLogicalName, 1)
-- Alter the database back to FULL
SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY FULL'
EXEC ( @SqlStatement )
-- Make sure it has been changed back to full
SET @SqlStatement = 'SELECT [name], [recovery_model_desc] FROM ' + DB_NAME() + '.sys.databases WHERE [name] = ''' + DB_NAME() + ''''
EXEC ( @SqlStatement )
------------------------------------------------------------------------------
-- ■■ WHILE문 연습
DECLARE @N INT
SET @N = 0
WHILE @N < 10000
BEGIN
  EXEC HERDIN_INC_100
  SET @N = @N + 1
END
 
USE [DB명]
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(1) FROM HERDIN

SELECT COUNT(*) FROM HERDIN

EXEC SP_WHO