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