DataBase 17

[MSSQL] 컬럼 수정시 ”Saving changes is not permitted.” 에러가 뜰경우

1. 상황 MSSQL에서 테이블을 수정하려고 하면 아래의 에러가 나오는 경우가 있다. MSSQL 공식 홈페이지에 따르면, 이는 다음과 같은 경우에 발생한다. 컬럼의 널 허용 옵션을 수정할 경우 컬럼의 정렬 순서를 변경할 경우 컬럼의 데이터 타입을 변경할 경우 새로운 컬럼을 추가했을 경우 테이블의 filegroup이나 해당 text/image 데이터를 변경할 경우 테이블의 메타데이터 구조를 변경하기 위해 테이블을 변경한 다음 테이블을 저장하는 경우 이러한 변경 사항에 따라 테이블을 다시 만들어야 한다. 이로 인해 테이블을 다시 생성하는 동안 메타 데이터가 손실되고 데이터가 직접 손실될 수 있기에, 위를 옵션으로 선택할 수 있게 둔 후, 기본적으로 막아준다고 한다. (하지만 필자가 현업에서 위 옵션을 비활성..

DataBase/MSSQL 2024.04.13

[MSSQL] 특정 Table을 사용하는 Procedure 조회하기

MSSQL에서 특정 Table를 사용하는 Procedure를 검색해보자. 아래의 쿼리로 검색을 하면 된다. SELECT Name FROM sys.procedures WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%%' 실행하면 위의 에 준 텍스트가 포함된 모든 procedure Name들이 출력된다. 이 말은 즉슨, Table명 뿐만 아니라 Procedure내에 구현된 모든 텍스트를 대상으로 검색하여, 해당되는 Procedure가 결과로 나타나게 된다. (당연하게도, 프로시저 내 주석 처리된 텍스트도 포함되어 출력되니, 이를 참고하자.)

DataBase/MSSQL 2024.04.13

[MSSQL] 대량의 Data를 DB에 삽입하는 방법

1. 개요 매일 자정마다 수많은 데이터를 가진 Table을 원격 DB에서 끌어다 와서 관리하는 DB로 복제하는 작업을 수행해야 했다. 하지만 매일 자정마다 복제하는 데이터의 크기가 자그마치 10~20만개 수준이었고, 이를 일일히 insert하면 약 16시간이라는 절망적인 퍼포먼스를 낳게 되어, 개선 방안을 강구하게 되었다. 2. 1차 개선 방법 우선은 현재 관리하는 DB와 원격 DB의 데이터들 중에 동일한 데이터들은 복제를 하지 않아도 된다. 이를 이용하여 원격 DB에서 가져온 데이터와 현재 관리하는 DB에서 가져온 데이터를 대조하여, 코드상에서 완전히 동일한 레코드는 C#코드에서 필터링 하는 로직을 추가하였다. 하지만 이는 추가적인 시간 소모를 불러일으켰다. 복제할 데이터들과 원본 데이터가 각각 10만..

DataBase/MSSQL 2024.03.31

[SSMS] 특정 테이블을 사용하는 모든 Procedure 찾기

종종 특정 테이블을 사용하는 모든 Stored Procedure를 찾는 일은 데이터베이스 유지 보수 및 의존성 분석에 중요하다. SQL Server에서 이를 수행하기 위해 다음과 같은 Procedure를 작성할 수 있다. CREATE PROCEDURE FindProceduresUsingTable @TableName NVARCHAR(128) AS BEGIN SET NOCOUNT ON; SELECT OBJECT_SCHEMA_NAME(o.object_id) AS SchemaName, o.name AS ProcedureName FROM sys.objects o INNER JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE m.definition LIKE '%'..

DataBase/MSSQL 2024.01.18

[SQL] Inner Join에서 조인 조건이 같을 시, 테이블 순서의 영향이 있을까?

1. 개요 SQL에서 Inner Join을 수행할 때, 조인 조건이 동일한 경우 테이블의 순서를 바꿔도 쿼리 결과는 동일하다. Inner Join은 두 개 이상의 테이블을 공통된 열을 기준으로 결합하는 연산이다. 조인 조건이 동일하다면 어떤 테이블을 먼저 명시하더라도 결과는 동일하게 나타난다. 2. 예제 예를 들어, A, B, C라는 세 개의 테이블이 있다고 가정해보자. 각각의 테이블은 다음과 같은 구조를 가지고 있다. 테이블 A: id | name | age ---+--------+----- 1 | John | 30 2 | Sarah | 25 테이블 B: id | address | city ---+-------------+------- 1 | 123 Main St | NY 2 | 456 Elm St |..

DataBase 2023.07.10

[Database] ACID(원자성, 일관성, 고립성, 지속성)

1. 개요 데이터베이스에서 트랜잭션의 특성을 나타내는 네가지 기본 원칙을 나타내는 약어가 있는데, 바로 ACID이다. 이에 대해서 알아보자. 2. ACID란? ACID는 Atomicity(원자성), Constistency(일관성), Isolation(고립성), Durability(지속성)을 나타내는 약어이다. 각각의 의미에 대해 나열해보고자 한다. 1. 원자성(Atomicity): 트랜잭션은 "원자적"이어야 한다. 이는 트랜잭션이 작업의 모든 단계를 완전히 수행하거나 아무 작업도 수행하지 않은 상태로 유지되어야 함을 의미한다. 트랜잭션 내의 모든 작업은 전부 성공적으로 완료되거나, 어느 하나라도 실패할 경우 모든 작업이 롤백되어 이전 상태로 복원된다. 2. 일관성(Consistency): 트랜잭션은 데이..

DataBase 2023.05.21

[MSSQL] MSSQL이란?

1. MSSQL이란? MSSQL(MS-SQL)은 미국 마이크로소프트(Microsoft)에서 개발한 관계형 데이터베이스 관리 시스템(RDBMS)이다. 마이크로소프트 SQL 서버(Microsoft SQL Server)라고도 한다. 윈도우(Windows) 기반의 IIS서버에서 주로 사용한다. 2. MSSQL의 특징 MSSQL은 대규모 데이터베이스 애플리케이션을 지원하는 기능적인 데이터 관리 솔루션이다. 이를 통해 사용자는 데이터를 구성, 저장, 관리하고, 데이터베이스에 대한 효율적인 액세스 및 조작이 가능하다. MSSQL은 다양한 기능을 제공하는데, ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션 지원, 복제, 보안 및 접근 제어, 데이터 백업 및 복구, 데이터베이스 관리 등이 포함된다. 또한 고급 쿼리..

DataBase/MSSQL 2023.05.21

[Database] UPSERT에 대해

1. UPSERT란? UPSERT는 UPDATE + INSERT의 합성어이다. 풀어서 설명하자면, DB의 데이터를 다룰 때 INSERT혹은 UPDATE를 할 때가 있는데, INSERT를 하고자 하는 데이터가 기존에 있을 경우, PRIMARY KEY가 중복되어 INSERT가 실패가 나게 되는데, 이럴때는 UPDATE가 동작하게 처리하는 것을 UPSERT라고 한다. 2. UPSERT구문 [MYSQL] INSERT INFO [table_name] ([col1], [col2]) VALUES ('[value1]', '[value2]') ON DUPLICATE KEY UPDATE '[col2]' = '[value2]'; 쿼리의 생김새도 INSERT쿼리와 UPDATE쿼리를 섞어놓은 것 같다. [ORACLE] MERG..

DataBase 2022.11.15

[Database] ORM에 대해

1. ORM이란? ORM(Object Relational Mapping)이란, 번역하면 (객체-관계-매핑)의 약자로, 다음과 같은 특징을 가지고 있다. 프로그래밍 언어의 객체와 데이터베이스의 데이터 관계를 매핑해주는 도구이다. MVC패턴에서 모델(Model)을 기술하는 도구이다. 객체와 모델 사이의 관계를 기술하는 도구이다. 2. ORM의 사용 이유 OOP vs Relational Database 객체지향 프로그래밍은 클래스를 이용하고 관계형 데이터베이스는 테이블을 이용하는데 여기서 객체 모델과 관계형 모델 간의 불일치가 존재한다. 따라서 ORM을 이용하여 데이터베이스 접근을 프로그래밍 언어의 관점에서 맞출수 있게 된다. 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다. SQL문을..

DataBase 2022.08.20

[PostgreSQL] Port 변경 방법

1. 개요 지난번 사건 그 이후, 아직도 DB에 침입을 시도하는 로그들이 보였다. 그래서 Postgresql의 기본 포트(5432)를 사용하고있는 것이 공격의 대상이 된다고 판단하여, 바꿔주기로 했다. 2. Port 변경 방법 2.1 Postgresql 설정파일 열기(시스템 마다 다를수 있음) $sudo vi /etc/postgresql/14/main/postgresql.conf 해당 파일을 열어 port 설정 부분을 보면 되고, 주석 처리 되어 있는 경우에는 주석을 풀고, 원하는 Port 번호로 수정해주면 된다. [설정 완료 후 Postgresql 재시작] $systemctl restart postgresql [혹은 재기동 없이 Config Reload] $su - postgres $psql postg..

DataBase/PostgreSQL 2022.06.04
반응형