-- ==========================================================
-- 양산형 테스트 기기 모니터링 시스템 MSSQL 2012 DB 구성 스크립트
-- 작성일: 2026-06-22
-- 호환 버전: Microsoft SQL Server 2012 이상
-- ==========================================================

USE [master];
GO

-- 데이터베이스 생성 (존재하지 않을 경우에만 생성)
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'MarkingDb')
BEGIN
    CREATE DATABASE [MarkingDb];
END
GO

USE [MarkingDb];
GO

-- ==========================================
-- 1. [Users] 테이블 생성 (작업자 정보 및 비밀번호 관리)
-- ==========================================
IF OBJECT_ID(N'[dbo].[Users]', N'U') IS NULL
BEGIN
    CREATE TABLE [dbo].[Users] (
        [Id]          INT IDENTITY(1,1) NOT NULL,
        [OperatorId]  VARCHAR(50)       NOT NULL,
        [Password]    VARCHAR(50)       NOT NULL,
        [Name]        NVARCHAR(50)      NULL,
        [IsActive]    BIT DEFAULT 1     NOT NULL,
        CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
        CONSTRAINT [UQ_Users_OperatorId] UNIQUE ([OperatorId])
    );
END
GO

-- 기본 테스트 계정 데이터 적재
IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'test')
BEGIN
    INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive])
    VALUES ('test', 'test', '테스트작업자', 1);
END
GO

IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'admin')
BEGIN
    INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive])
    VALUES ('admin', 'admin', '시스템관리자', 1);
END
GO

IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'su')
BEGIN
    INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive])
    VALUES ('su', 'su', '최고권한자', 1);
END
GO


-- ==========================================
-- 2. [Marking] 테이블 생성 (성능 측정 결과 적재)
-- ==========================================
IF OBJECT_ID(N'[dbo].[Marking]', N'U') IS NULL
BEGIN
    CREATE TABLE [dbo].[Marking] (
        [IC_SN]           VARCHAR(50)   NOT NULL,
        [Marking_QR]      NVARCHAR(100) NOT NULL,
        [Maker]           NVARCHAR(10)  NOT NULL,
        [Model]           NVARCHAR(10)  NOT NULL,
        [Variant_1]       NVARCHAR(10)  NOT NULL,
        [Variant_2]       NVARCHAR(10)  NOT NULL,
        [Operator]        NVARCHAR(10)  NOT NULL,
        [Production_Date] DATETIME2(0)  NOT NULL,
        [Line]            NVARCHAR(10)   NOT NULL,
        [Lot_No]          NVARCHAR(8)   NOT NULL,
        [Jig_No]          NVARCHAR(10)  NOT NULL,
        [PT_Vol_1]        DECIMAL(4, 2) NOT NULL,
        [PT_Current_1]    DECIMAL(4, 2) NOT NULL,
        [PT_Resistance_1] DECIMAL(5, 3) NOT NULL,
        [Result]          NVARCHAR(5)   NOT NULL,
        [Spare_1]         NVARCHAR(30)  NULL,
        [Spare_2]         NVARCHAR(30)  NULL,
        [Spare_3]         NVARCHAR(30)  NULL,
        [Spare_4]         NVARCHAR(30)  NULL,
        CONSTRAINT [PK_Marking] PRIMARY KEY CLUSTERED ([IC_SN] ASC),
        CONSTRAINT [UQ_Marking_Marking_QR] UNIQUE ([Marking_QR])
    );

    -- 시리얼 번호(IC_SN) 조회용 인덱스는 클러스터드 기본키로 지정되었으므로 생략 또는 추가 필요 시 생성
END
GO


-- ==========================================
-- 3. [CheckOperator] 로그인 검증용 저장 프로시저 생성
-- ==========================================
IF OBJECT_ID(N'[dbo].[CheckOperator]', N'P') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[CheckOperator];
END
GO

CREATE PROCEDURE [dbo].[CheckOperator]
    @Operator    VARCHAR(50),
    @Password    VARCHAR(50),
    @ProcessName VARCHAR(50) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    -- 대소문자 구분 없이 입력 ID와 비밀번호 매칭 여부를 카운트(0 또는 1)로 리턴
    SELECT COUNT(*) 
    FROM [dbo].[Users]
    WHERE UPPER([OperatorId]) = UPPER(@Operator)
      AND [Password] = @Password
      AND [IsActive] = 1;
END;
GO
