2011-02-23 2 views
1

필자는 사용자가 새 시스템을 활성화 할 때 이전 버전의 활성화를 잠금 테이블에 추가하여 최신 X 시스템 만 활성화 할 수있는 라이센스 시나리오를 가지고 있습니다. 최근의 활성화 횟수를 유지하기위한 매개 변수를 전달해야하며 이전의 모든 활성화는 잠금 상태가 아닌 경우 잠금 테이블에 추가해야합니다. 예를 들어 임시 테이블 (예 : 임시 테이블)을 수행하는 것이 최선인지 모르겠습니다.새 레코드를 추가 할 때 가장 오래된 X 레코드를 덤프하는 SQL Server 저장 프로 시저

예를 들어 활성화는 Johndee 시스템 XYZ에서 시작됩니다. 그런 다음 John Doe의 모든 활성화에 대한 활성화 테이블을 쿼리하고 DATE DESC로 정렬해야합니다. John Doe는이 경우 두 개의 시스템을 허용하는 라이센스를 보유 할 수 있으므로 비활성화 된 상위 2 개 레코드보다 오래된 모든 레코드가 필요합니다. 즉, 잠금 테이블에 삽입해야합니다.

미리 도움을 주셔서 감사합니다.

답변

1

아마도 이와 비슷한 것일 수 있습니까?

insert into lockouts 
    (<column list>) 
    select <column list> 
     from (select <column list>, 
        row_number() over (order by date desc) as RowNum 
        from activations) t 
     where t.RowNum > @NumLicenses 
+0

나는 당신이 나를 도울 수있는 장애물에 부딪혔다. My Activations 테이블에 CustomerName, KeyCode, MachineName, ActivationDate 같은 열이 있습니다. 동일한 시스템을 다시 활성화 할 수 있으므로 ActivationDate를 제외하고 모두 동일한 10 개의 레코드가있을 수 있습니다. DISTINCT와 DESC 활성화가있는 결과 세트를 얻으려면 어떤 방법이 필요합니다. 그래서 동일한 기계에 대해 반복되는 반복 정보를 가진 행 번호가 다시 활성화되지 않습니다. 별개의 결과 집합을 얻은 후에 제안 할 행 번호를 적용해야합니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 고맙습니다. – Neal

+0

@Neal : [내 대답] (http://stackoverflow.com/questions/5111048/tsql-to-get-distinct-records-ordered-and-then-apply-row-numbers/5111226#5111226)을 게시했습니다.)에 대한 [follow-up question] (http://stackoverflow.com/questions/5111048/tsql-to-get-distinct-records-ordered-and-then-apply-row-numbers)을 참조하십시오. –

0

그것은 아마도 부부에게 가장 쉬운 뷰 또는 테이블 반환 함수와 이상() ROW_NUMBER하는 것 :

WITH ActivationRank AS 
(
SELECT SystemId,ProductId,CreatedDate,ROW_NUMBER() OVER(PARTITION BY ProductId ORDER BY CreatedDate DESC) AS RANK  
FROM [Activations] 
) 

SELECT SystemId, ProductId, CASE WHEN RANK < @lockoutParameterOrConstant 0 ELSE 1 END AS LockedOut 
FROM ActivationRank 
0

것은 읽고 나의 접근 방식을 시도 할 시간을 투자하기 전에, 내가 원하는 Joe Stefanelli의 답변이 짧고, 작고, 진보되어 있으며, 아마도 성능보다 성능이 우수 할 것입니다. 반면에 성능이 가장 중요하지 않을 수도 있습니다 (1 분당 시간당 얼마나 많은 활성화가 하루에 예상됩니까?). 예제는 읽기 쉽고 이해하기 쉽습니다.

데이터베이스 스키마가 어떻게 설정되어 있는지 알 수 없으므로 여기에 몇 가지 가정 사항이 있습니다. 이 코드를 복사하여 붙여 넣기 템플릿으로 사용할 수는 없지만이를 수행하는 방법에 대한 아이디어를 제공해야합니다.

당신은 잠금 테이블에 대해 이야기하고 있었으므로 데이터의 일부를 두 번째 테이블에 복제 할 이유가 있다고 생각합니다. 가능하다면 시스템 데이터가 포함 된 테이블에서 잠금 플래그를 사용 하겠지만 시나리오에 따라 다릅니다.

현재 SQL Server에 액세스 할 수 없으므로 코드의 유효성을 검사 할 수 없습니다. 최선을 다했지만 오타가있을 수 있습니다.

먼저 가정 : 최소한의 "등록 시스템"테이블 :

CREATE TABLE registered_systems 
    (id INT NOT NULL IDENTITY, 
    owner_id INT NOT NULL, 
    system_id VARCHAR(MAX) NOT NULL, 
    activation_date DATETIME NOT NULL) 

둘째 가정 :

CREATE TABLE locked_out_systems 
    (id INT NOT NULL, 
    lockout_date DATETIME NOT NULL) 

그런 다음 우리가 활성화 저장 프로 시저를 정의 할 수 있습니다 최소한의 테이블 "시스템 잠금" 새로운 시스템. 그것은 owner_id, 허용 된 시스템의 수 그리고 새로운 시스템 ID를 매개 변수로 취합니다.

CREATE PROCEDURE register_new_system 
    @owner_id INT, 
    @allowed_systems_count INT, 
    @new_system_id VARCHAR(MAX) 
AS 
BEGIN TRANSACTION 
    -- Variable declaration 
    DECLARE @sid INT -- Storage for a system id 

    -- Insert the new system 
    INSERT INTO registered_systems 
     (owner_id, system_id, activation_date) 
    VALUES 
     (@owner_id, @system_od, GETDATE()) 

    -- Use a cursor to query all registered-and-not-locked-out systems for this 
    -- owner. Skip the first @allowed_systems_count systems, then insert the 
    -- remaining ones into the lockout table. 
    DECLARE c_systems CURSOR FAST_FORWARD FOR 
     SELECT system_id FROM 
     registered_systems r 
     LEFT OUTER JOIN 
     locked_out_systems l 
     ON r.system_id = l.system_id 
     WHERE l.system_id IS NULL 
     ORDER BY r.activation_date DESC 

    OPEN c_systems 

    FETCH NEXT FROM c_systems INTO @sid 

    WHILE @@FETCH_STATUS = 0 
    BEGIN  
     IF @allowed_systems_count > 0 
      -- System still allowed, just decrement the counter 
      SET @allowed_systems_count = @allowed_systems_count -1 
     ELSE 
      -- All allowed systems used up, insert this one into lockout table 
      INSERT INTO locked_out_systems 
      (id, lockout_date) 
      VALUES 
      (@sid, GETDATE()) 

     FETCH NEXT FROM c_systems INTO @sid 
    END 

    CLOSE c_systems 
    DEALLOCATE c_systems 

COMMIT 
+0

감사합니다 패트릭 - 멋진 정보와 도움을 주셔서 감사합니다. Joe의 답변을 가장 단순한 구현으로 선택했습니다. – Neal

관련 문제