SSMS 완료시간 : 안 보여지도록 옵션 수정

DataBase/MS-SQL|2020. 12. 16. 09:32
반응형

SSMS(SQL Server Management Studio)

 

도구 - 옵션에 아래 옵션을 체크 해제 하면 됩니다.

 

쿼리실행 - SQL Server - 고급 - 완료 시간 표시 체크 해제

 

댓글()

System.Security.SecurityException: 요청한 레지스트리에 액세스할 수 없습니다.

Progmming/.Net|2020. 12. 15. 10:34
반응형

오류 메시지

 

System.Security.SecurityException: 요청한 레지스트리에 액세스할 수 없습니다.

 

 

해결 방법

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

 

EnableLUA 값 데이터를 0으로 설정.

 

댓글()

Facebook 연동 오류 , Invalid Scope: Array (Please check lower letter case or delimiter)

에러노트|2020. 11. 16. 23:02
반응형

오류 메시지 : Invalid Scope: Array (Please check lower letter case or delimiter)

 

해결 방법 :  Scope에 대한 정의가 바뀐 것 같음.

 

"scope"   => ['public_profile', 'email'] 

 

배열로 되어있던 기존 상태에서 

 

콤마 혹은 공백으로 구분하여 아래와 같이 수정.

 

"scope"   => 'public_profile,email'

 

 

 

참고 자료 

 

stackoverflow.com/questions/63620672/hybridauth-facebook-invalid-scope-array-please-check-lower-letter-case-or-deli

 

HybridAuth Facebook Invalid Scope: Array (Please check lower letter case or delimiter)

Facebook started returning this error a few days ago: "Invalid Scope: Array (Please check lower letter case or delimiter)" I haven't made a changes to the login functionality, or facebook...

stackoverflow.com

 

sir.kr/g5_tip/14440

 

페이스북 소셜로그인 에러가 발생될 때 > SIR

페이스북 소셜로그인에서 아래와 같은 에러가 발생될 때 극복 방법입니다.

Invalid Scope: Array (Please check lower letter case or delimiter)

 

plugin/social/includes/functions.php 파일 325줄

sir.kr

 

댓글()

디비 백업 프로시저 및 리포트 메일 발송 기능

DataBase/MS-SQL|2020. 10. 5. 22:30
반응형

전문가 분들은 광고 클릭후 닫아주시면 감사하겠습니다. :)

저와 같이 운영관리에 익숙치 않은 분들을 위한 실 사용 사례입니다.

 

 

1. master DB에 백업 기록을 위한 테이블을 생성했습니다.

USE [master]
GO
-- 시작안되는 경우도 발생하기 때문에 startDt 기본값을 넣지 않음.  
CREATE TABLE [dbo].[tblBackupDB](
	[dbName] [varchar](50) NULL,
	[startDt] [datetime] NULL,
	[endDt] [datetime] NULL,
	[msg] [ntext] NULL,
	[mdfSize] [int] NULL,
	[ldfSize] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

 

 

2. 백업을 위한 프로시저 생성, DATEPART를 이용해 특정 요일마다 풀백업과 차등백업을 반복하도록 설정.

 

샘플을 위해 특정 요일에 풀백업 그 외 차등백업으로 규정하였으나

 

적절한 풀백업과 차등백업을 번갈아가며 환경에 맞는 주기를 설정합니다.

 

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_DataBaseBackup]
AS
BEGIN
	
	DECLARE @dbName varchar(4000), @SQL varchar(4000) 
	DECLARE @yoil int , @mdfSize int , @ldfSize int 
	
	SELECT @yoil = DATEPART(WEEKDAY,GETDATE())
	 
	-- 백업대상 기록 , 시스템 디비는 제외
	INSERT INTO master.dbo.tblBackupDB(dbName) 
		SELECT name 
			FROM sys.databases 
			WHERE UPPER(name) NOT IN ('MASTER','MODEL','MSDB','TEMPDB')

	-- 서버 아이피 체크
	declare @ip_v4 varchar(16) 
	SELECT DISTINCT @ip_v4 = local_net_address
	FROM sys.dm_exec_connections
	WHERE local_net_address IS NOT NULL and local_net_address <> '127.0.0.1' 

	DECLARE bk_cursor CURSOR FOR 
		SELECT name 
			FROM sys.databases 
			WHERE UPPER(name) NOT IN ('MASTER','MODEL','MSDB','TEMPDB')
	OPEN bk_cursor

	FETCH NEXT FROM bk_cursor 
	INTO @dbName 

	WHILE @@FETCH_STATUS = 0
	BEGIN
		BEGIN TRY
			-- mdf 파일 사이즈
			SELECT @mdfSize = SUM(size)*8/1024	--MB
			FROM sys.databases   
			JOIN sys.master_files  
			ON sys.databases.database_id=sys.master_files.database_id  
			WHERE sys.databases.name = @dbName and type='0'
			 
			-- ldf 파일 사이즈
			SELECT @ldfSize = SUM(size)*8/1024	--MB
			FROM sys.databases   
			JOIN sys.master_files  
			ON sys.databases.database_id=sys.master_files.database_id  
			WHERE sys.databases.name = @dbName and type='1'

			-- 백업시작 기록/용량 기록 
			UPDATE master.dbo.tblBackupDB 
				SET startDt = GETDATE() , mdfSize = @mdfSize, ldfSize = @ldfSize
				WHERE dbname = @dbName 
					AND startDt is null

			IF @yoil = 7 -- 토요일은 풀백업 
				BEGIN
					--풀백업	
					SET @SQL = 'BACKUP DATABASE ['+@dbName+'] TO DISK = N''D:\Backup\'+convert(varchar(30), getdate(),112)+'_'+@dbName+'.bak'' WITH COMPRESSION, INIT, NAME = '''+@dbName+' - Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10;'
				END 
			ELSE	 -- 주간은 차등백업
				BEGIN
					--차등백업			
					SET @SQL = 'BACKUP DATABASE ['+@dbName+'] TO  DISK = N''D:\Backup\'+convert(varchar(30), getdate(),112)+'_'+@dbName+'.bak'' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'''+@dbName+' - Backup'', SKIP, NOREWIND, NOUNLOAD,  STATS = 10;'
				END 
			--print @SQL
			EXEC (@SQL)
		
			-- 백업종료 기록 
			UPDATE master.dbo.tblBackupDB 
				SET endDt = GETDATE()
				WHERE dbname = @dbName 
					AND CONVERT(CHAR(10),startDt,23) = CONVERT(CHAR(10),GETDATE(),23)  
					AND endDt IS NULL  

		END TRY
		BEGIN CATCH
				-- 에러 기록 
				UPDATE master.dbo.tblBackupDB 
					SET msg = 'ERROR_NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR) + '
						 ERROR_MESSAGE: ' + ERROR_MESSAGE()
					WHERE dbname = @dbName 
						AND CONVERT(CHAR(10),startDt,23) = CONVERT(CHAR(10),GETDATE(),23)  
						AND endDt IS NULL  
		END CATCH

		FETCH NEXT FROM bk_cursor 
		INTO @dbName 
	END 
	CLOSE bk_cursor;
	DEALLOCATE bk_cursor;

	-- FREEPROCCACHE 는 메모리 상에 전체 캐시를 비우기 
	-- https://bit.ly/3icmJ85
	DBCC FREEPROCCACHE; 
END

 

 

 

3. 백업 후 남겨진 기록과 msdb.dbo.backupset 테이블 데이터를 참조하여 리포팅 메일 발송.

메일 발송을 위해 데이터베이스 메일 구성이 되어있어야 합니다.

 html 코딩은 개인 취향대로.. msdb.dbo.backupset 에는 생각보다 많은 정보가 들어있습니다.

bit.ly/2Gxce24 참고

 

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER PROCEDURE [dbo].[spSendBackupReport]
AS
BEGIN 
	SET NOCOUNT ON; 

	DECLARE @dbName varchar(100),@sDt datetime , @eDt datetime , @result nvarchar(50)
	DECLARE @html varchar(max) , @ip_v4 varchar(16) , @subject varchar(200)
	DECLARE @idx int , @mdfSize int , @ldfSize int  , @backupSize int ,@totalBackupSize bigint , @BackupType nvarchar(20)

	SET @idx = 1

	SELECT DISTINCT @ip_v4 = local_net_address
	FROM sys.dm_exec_connections
	WHERE local_net_address IS NOT NULL and local_net_address <> '127.0.0.1' 

	SET @subject =  'DB Server Backup Report - '+ @ip_v4
	SET @totalBackupSize = 0

	SET @html = ' 
		<div><h2>시스템에서 자동 발송되는 DB 백업 결과 메일입니다.</h2></div>
		<div><h3> IP : '+@ip_v4+'</h3></div>
		<div><h3> DATE : '+ CONVERT(VARCHAR(10) , GETDATE(),121) +'</h3></div>
		<div><h3> Total Backup Size : #TOTALBACKUPSIZE#   ( ※ 단순참고용, 연산에 의한 오차발생 ) </h3></div>
		<table style="border-collapse: collapse;font-size: small;">
			<tr>
				<td colspan="6">&nbsp;</td>
			</tr>
			<tr "class="tr">
				<td style="width:20px;border: 1px solid black;text-align:center;padding: 5px;">#</td>
				<td style="width:150px;border: 1px solid black;text-align:center;padding: 5px;">DB</td>
				<td style="width:150px;border: 1px solid black;text-align:center;padding: 5px;">DB Size</td>
				<td style="width:180px;border: 1px solid black;text-align:center;padding: 5px;">Backup Size<br/>/ Type</td>
				<td style="width:100px;border: 1px solid black;text-align:center;padding: 5px;">Start<br/>/ End</td>
				<td style="width:100px;border: 1px solid black;text-align:center;padding: 5px;">Processing Time (Min.)</td>
				<td style="width:70px;border: 1px solid black;text-align:center;padding: 5px;">Result</td>
			</tr>
	'

	-- https://bit.ly/2Gxce24 // msdb.dbo.backupset 백업셋 데이터 테이블 참조 

	DECLARE vendor_cursor
	CURSOR FOR
		SELECT D.name ,B.startDt , B.endDt 
		, case when B.endDt is null then '<span style="color:red;font-weight:bold;">실패</span>' else '성공' end as result
		, B.mdfSize ,  B.ldfSize
		, BS.compressed_backup_size 
		, case Type when  'I' then N'차등백업' when 'D' then N'풀백업' end as BackupType
		FROM sys.databases D 
			LEFT OUTER JOIN tblbackupDB B 
				ON D.name = DBNAME  AND CONVERT(CHAR(10),endDt,23) = CONVERT(CHAR(10),GETDATE(),23)
			LEFT OUTER JOIN msdb..backupset BS 
				ON D.name = BS.database_name AND  CONVERT(CHAR(10),BS.backup_start_date,23) = CONVERT(CHAR(10),GETDATE(),23)
		WHERE UPPER(D.name) NOT IN ('MASTER','MODEL','MSDB','TEMPDB')
	OPEN vendor_cursor
	FETCH NEXT FROM vendor_cursor
	INTO @dbName ,@sDt , @eDt, @result , @mdfSize , @ldfSize , @backupSize , @BackupType

	WHILE @@FETCH_STATUS = 0
		BEGIN
		SET @html +='
		<tr>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+ cast(@idx as varchar) +'</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+@dbName+'</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">DATA : '+ CAST(FORMAT(isnull(@mdfSize,0)/1024, N'#,0') AS VARCHAR)+' GB <br/>Log : '+ CAST(FORMAT(isnull(@ldfSize,0), N'#,0') AS VARCHAR)+' MB</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+ CAST(FORMAT(isnull(@backupSize,0)/1024/1024, N'#,0') AS VARCHAR)+' MB<br/>'+ @BackupType+'</td> 
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+ltrim(rtrim(isnull(CONVERT(CHAR(8), @sDt, 8),'-')))+'<br/>'+ltrim(rtrim(isnull(CONVERT(CHAR(8), @eDt, 8),'-')))+'</td> 
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+case when ltrim(rtrim(isnull(DATEDIFF(MINUTE,@sDt,@eDt),'-'))) = '0' then N'1 미만' else ltrim(rtrim(isnull(DATEDIFF(MINUTE,@sDt,@eDt),'-')))  end +'</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+@result+'</td>
		</tr>
		'

		SET @totalBackupSize += @backupSize
		SET @idx = @idx + 1
		FETCH NEXT FROM vendor_cursor
		INTO @dbName ,@sDt , @eDt, @result, @mdfSize , @ldfSize  , @backupSize , @BackupType
	END
	CLOSE vendor_cursor;
	DEALLOCATE vendor_cursor;

	SET @html += '</table>'

	SET @html = replace(@html,'#TOTALBACKUPSIZE#',CAST(FORMAT(isnull(@totalBackupSize,0)/1024/1024, N'#,0') AS VARCHAR)+' MB')
	  
	EXEC msdb. dbo.sp_send_dbmail	-- sp_send_dbmail 상세 >> https://bit.ly/30zkdTj 
		@profile_name='메일프로필',
		@body_format = 'HTML' , -- 바디타입
		@recipients= '받을사람',
		@blind_copy_recipients= '숨김참조',
		@subject = @subject,
		@body =@html
END

 

 

4. 결과적으로 시스템에서 발송해서 수신된 메일은 아래와 같습니다.

 

 

 

적당히 내용을 수정하여 입맛에 맛도록 수정 사용하시기 바랍니다.

댓글()

저장하지 않은 쿼리 확인 하는 방법 , 강제 종료 시 쿼리 복구

DataBase/MS-SQL|2020. 9. 29. 23:34
반응형

때때로 ssms가 강제 종료 된다거나 저장하지 않고 닫았을 때

SQL 쿼리를 복구 해야하는 경우 아래의 쿼리에서 일정 시간동안 쿼리 확인이 가능합니다.

 

Use <database>
SELECT execquery.last_execution_time AS [Date Time], execsql.text AS [Script] FROM sys.dm_exec_query_stats AS execquery
CROSS APPLY sys.dm_exec_sql_text(execquery.sql_handle) AS execsql
ORDER BY execquery.last_execution_time DESC

 

 

참조 Url : qastack.kr/programming/15034832/recover-unsaved-sql-query-scripts

댓글()

SQL Server 에이전트에 등록된 작업 목록 조회

DataBase/MS-SQL|2020. 8. 5. 17:10
반응형

SQL Server 에이전트에 등록된 작업 목록을 조회 하는 SQL 입니다.

SELECT
	A.name,
	case description when '설명이 없습니다.' then '' else description end as description,   
  CASE convert(
    nvarchar(3), 
    [freq_type], 
    3
  ) WHEN 4 THEN N' 매일' WHEN 8 THEN N' 매주 ' + CASE WHEN [freq_interval] & 1 = 1 THEN N'일' ELSE '' END 
	+ CASE WHEN [freq_interval] & 2 = 2 THEN ' 월' ELSE '' END + CASE WHEN [freq_interval] & 4 = 4 THEN ' 화' ELSE '' END + CASE WHEN [freq_interval] & 8 = 8 THEN ' 수' ELSE '' END + CASE WHEN [freq_interval] & 16 = 16 THEN N' 목' ELSE '' END + CASE WHEN [freq_interval] & 32 = 32 THEN N' 금' ELSE '' END + CASE WHEN [freq_interval] & 64 = 64 THEN N' 토' ELSE '' END WHEN 16 THEN N'하루 한번 ' 
	+ CAST(
    [freq_interval] AS VARCHAR(3)
  ) + N' 매달 ' + CAST(
    [freq_recurrence_factor] AS VARCHAR(3)
  ) + N' 매달' WHEN 32 THEN N'발생 ' + CASE [freq_relative_interval] WHEN 1 THEN N'첫째' WHEN 2 THEN N'둘째' WHEN 4 THEN N'셋째' WHEN 8 THEN N'넷째' WHEN 16 THEN N'마지막' END + ' ' + CASE [freq_interval] WHEN 1 THEN N'일' WHEN 2 THEN N'월' WHEN 3 THEN N'화' WHEN 4 THEN N'수' WHEN 5 THEN N'목' WHEN 6 THEN N'금' WHEN 7 THEN N'토' WHEN 8 THEN N'일' WHEN 9 THEN N'평일' WHEN 10 THEN N'주말' END + N' 모든 ' + CAST(
    [freq_recurrence_factor] AS VARCHAR(3)
  ) + N' 매달' END AS [Recurrence], 
  CASE convert(
    nvarchar(3), 
    [freq_subday_type], 
    3
  ) WHEN 1 THEN  STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) WHEN 2 THEN N'주기적 발생 ' + CAST(
    [freq_subday_interval] AS VARCHAR(3)
  ) + N' 초(s) 간격 ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) + ' & ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_end_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) WHEN 4 THEN N'주기적 발생 ' + CAST(
    [freq_subday_interval] AS VARCHAR(3)
  ) + N' 분(s) 간격 ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) + ' & ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_end_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) WHEN 8 THEN N'주기적 발생 ' + CAST(
    [freq_subday_interval] AS VARCHAR(3)
  ) + N' 시간(s) 간격 ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) + ' & ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_end_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) END [Frequency],  D.step_id, D.step_name, D.command 
FROM msdb.dbo.sysjobs A 
	INNER JOIN msdb.dbo.sysjobschedules B ON A.job_id = B.job_id 
	INNER JOIN msdb.dbo.sysschedules C ON B.schedule_id = C.schedule_id 
	INNER JOIN msdb.dbo.sysjobsteps D ON A.job_id = D.job_id  
ORDER BY A.name

 

실행 결과는 대략 아래와 같이 조회가 됩니다.

 

댓글()

백업 혹은 복구중인 데이터베이스 진행률 확인

DataBase/MS-SQL|2020. 8. 5. 10:03
반응형

백업 혹은 복구 중인 데이터 베이스의 진행 상태나 진행률을 확인하는 SQL 입니다.

 

경과된 시간 , 남은 시간 , 예상 소요 시간등을 확인 할 수 있습니다.

 

SELECT r.session_id,r.command
,cast(CONVERT(NUMERIC(6,2),r.percent_complete)  as varchar) + ' %' AS [Percent Complete]
,CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time]
,CONVERT(NUMERIC(10,2),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min]
,CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0) AS [ETA Min]
,CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours]
,CONVERT(VARCHAR(1000),(SELECT text FROM sys.dm_exec_sql_text(sql_handle))) AS [SQL] 
FROM sys.dm_exec_requests r WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')

 

댓글()

프로시저(sp)에서 사용하는 테이블 목록 , 특정 테이블을 참조하는 프로시저 목록

DataBase/MS-SQL|2020. 8. 4. 18:05
반응형

테이블의 속성이 변경되었을 때

혹은 컬럼 속성이 변경되었을 때 

아니면 테이블의 용도나 정체(?)를 알 수 없을 때

관련된 sp를 확인하기 위해서 개인적으로 자주 사용하는 SQL 입니다.

 

특정 프로시저에서 사용하는 테이블 목록을 조회하는 SQL 문입니다.

 

-- 프로시저에서 사용하는 테이블 목록
;WITH stored_procedures AS 
(   

    SELECT oo.name AS table_name,   o.name,
		ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row   
    FROM sysdepends d   
	    INNER JOIN sysobjects o ON o.id=d.id   
	    INNER JOIN sysobjects oo ON oo.id=d.depid   
    WHERE o.xtype = 'P' AND o.name LIKE '%프로시저명%' 
)  

SELECT name,Table_name FROM stored_procedures  
WHERE row = 1

 

반대로 특정 테이블을 참조하는 프로시저 목록을 조회하는 SQL문 입니다.

 

-- 특정 테이블을 참조하는 프로시저 목록
;WITH stored_procedures AS 
(   

    SELECT oo.name AS table_name,   o.name,
		ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row   
    FROM sysdepends d   
	    INNER JOIN sysobjects o ON o.id=d.id   
	    INNER JOIN sysobjects oo ON oo.id=d.depid   
    WHERE o.xtype = 'P' AND oo.name = '테이블명' 
)  

SELECT name,Table_name FROM stored_procedures  
WHERE row = 1

댓글()