Citação:
-- Verifica se a tabela [DupesDetected] existe, e caso exista, ela é excluída
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[DupesDetected]')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[DupesDetected]
GO
-- Cria a tabela [DupesDetected]
CREATE TABLE [dbo].[DupesDetected] (
[ID] [int] IDENTITY (1, 1) NOT NULL,
[AccountID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Name] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[ITEM_TYPE] [binary] (1) NOT NULL,
[ITEM_SERIAL] [binary] (4) NOT NULL,
[INV_POSITION] [smallint] NOT NULL,
[WH_POSITION] [smallint] NOT NULL,
[TIMESTAMP] [smalldatetime] NOT NULL
) ON [PRIMARY]
GO
-- Cria a chave primária para a tabela [DupesDetected]
ALTER TABLE [dbo].[DupesDetected] WITH NOCHECK ADD
CONSTRAINT [PK_DupesDetected] PRIMARY KEY CLUSTERED
(
[ID]
) ON [PRIMARY]
GO
-- Adiciona um valor padrão para a coluna [TIMESTAMP]
ALTER TABLE [dbo].[DupesDetected] ADD
CONSTRAINT [DF_Table1_TIMESTAMP] DEFAULT (GETDATE()) FOR [TIMESTAMP]
GO
-- Cria o trigger [DUPEFINDER] para detectar itens duplicados
CREATE TRIGGER [dbo].[DUPEFINDER] ON [dbo].[character]
FOR UPDATE
AS
IF UPDATE(inventory)
BEGIN
SET NOCOUNT ON
DECLARE
@CHARNAME varchar(10),
@ACCOUNT_ID varchar(10),
@INV binary(760),
@ITEM_TYPE binary(1),
@ITEM_SERIAL binary(4),
@WAREHOUSE binary(1200),
@j smallint,
@k smallint,
@PWOLD smallint,
@PWNEW smallint
-- Obtém o inventário e os dados do usuário
SELECT @ACCOUNT_ID = accountid, @CHARNAME = Name, @INV = inventory FROM inserted
SET @j = 0
-- Itera sobre os itens do inventário
WHILE (@j < 76) AND (@INV IS NOT NULL)
BEGIN
-- Obtém o tipo e o serial do item
SET @ITEM_TYPE = SUBSTRING(@INV, @j * 10 + 1, 1)
SET @ITEM_SERIAL = SUBSTRING(@INV, @j * 10 + 4, 4)
-- Verifica se o tipo é válido e o serial não é "0"
IF @ITEM_TYPE <> 0xFF AND @ITEM_SERIAL <> 0x00000000
BEGIN
-- Obtém os dados do warehouse caso ainda não tenha sido feito
IF (@WAREHOUSE IS NULL)
BEGIN
SELECT @WAREHOUSE = items, @PWOLD = pw FROM warehouse WHERE accountid = @ACCOUNT_ID
END
-- Itera sobre os slots do warehouse
SET @k = 0
WHILE (@k < 120) AND (@WAREHOUSE IS NOT NULL)
BEGIN
-- Verifica se o tipo e o serial coincidem
IF (SUBSTRING(@WAREHOUSE, @k * 10 + 1, 1) = @ITEM_TYPE) AND (SUBSTRING(@WAREHOUSE, @k * 10 + 4, 4) = @ITEM_SERIAL)
BEGIN
-- Insere o item duplicado no log
INSERT INTO DupesDetected (AccountID, Name, ITEM_TYPE, ITEM_SERIAL, INV_POSITION, WH_POSITION)
VALUES (@ACCOUNT_ID, @CHARNAME, @ITEM_TYPE, @ITEM_SERIAL, @j, @k)
-- Desconecta o usuário
UPDATE MEMB__STAT SET CONNECTSTAT = 0 WHERE ACCOUNTID = @ACCOUNT_ID
-- Bloqueia o baú
-- Obtém o novo código de bloqueio
SET @PWNEW = DATEPART(YYYY, GETDATE()) + DATEPART(MM, GETDATE()) + DATEPART(D, GETDATE())
-- Atualiza o código de bloqueio do baú
UPDATE WAREHOUSE SET PW = @PWNEW, LASTPW = @PWOLD WHERE (ACCOUNTID = @ACCOUNT_ID)
-- Bane todos os personagens da conta
UPDATE [CHARACTER] SET CTLCODE = 1 WHERE ACCOUNTID = @ACCOUNT_ID
END
-- Incrementa o contador para o próximo slot
SET @k = @k + 1
END
END
-- Incrementa o contador para o próximo item
SET @j = @j + 1
END
SET NOCOUNT ON
END
GO