2017-01-15 5 views
1

Je suis en train de faire en sorte que quand les gens créent des tables, il commence par le préfixe tblpeut sembler ne pas comparer à varchar dans SQL Server

Voici ce que je l'ai fait à partir de maintenant:

CREATE TRIGGER trg_tbl ON DATABASE 
FOR CREATE_TABLE 
AS 
    DECLARE @name VARCHAR(25) 

    SET @name = (SELECT TOP 1 name 
       FROM sys.tables 
       ORDER BY create_date DESC) 

    IF (SELECT SUBSTRING(@name, 1, 3) != 'tbl' 
     PRINT 'Tables must begin with the prefix tbl' 

    ROLLBACK 
GO 

Le problème est qu'il ne me laisse pas utiliser l'opérateur !=. J'ai essayé d'utiliser =<> ou LIKE mais rien ne semble fonctionner il continue de me dire que la syntaxe est incorrecte s'il vous plaît aider j'ai regardé partout en ligne et tout le monde dit que = ou LIKE de travail. :(

+0

Eh bien, si vous êtes stupide comme moi et ne savez pas comment votre problème exe n'oubliez pas de vous fermer SELECT comme si (SELECT SUBSTRING (@ nom, 1,3))! = « TBL » tout sera ensuite être bien –

Répondre

2

erreur est en raison d'un support de fermeture manquant à:

IF (SELECT SUBSTRING(@name,1,3) != 'tbl' 

peut être fixé en ajoutant le support de fermeture manquant:

IF (SELECT SUBSTRING(@name,1,3)) != 'tbl' 

Cependant, vous n'avez pas besoin de faire sélectionnez pour effectuer substring

Vous pouvez le faire.

IF SUBSTRING(@name,1,3) != 'tbl' 
+0

Thx gars maintenant qu'il a été répondu dois-je le fermer ou vérifier une case répondue. Nouveau sur ce site –

+0

Vous devez accepter la réponse. Il suffit de cliquer sur la marque ci-dessous des boutons de vote – Hadi

+0

@TristanClaude définir cette réponse comme acceptée, comme ce screenhoot

3

Bien que l'autre réponse explique le problème dans votre code. Je vous suggère d'utiliser la fonction Eventdata() pour récupérer le nom de la table

également votre déclencheur DDL sera rollback chaque action Create Table même si le nom de la table commence par tb1. Vous devez appliquer rollback uniquement lorsque le nom de la table ne commence pas par tb1 déplacez la commande rollback dans la condition IF.

Utilisez le bloc BEGIN-END lorsque la condition IF comporte plusieurs instructions, sinon la première instruction sera prise en compte dans la condition IF.

CREATE TRIGGER trg_tbl 
ON DATABASE 
FOR CREATE_TABLE 
AS 
    BEGIN 
     SET NOCOUNT ON 

     DECLARE @TABLE_NAME SYSNAME 

     SELECT @TABLE_NAME = Eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME') 

     IF LEFT (@TABLE_NAME, 3) != 'tbl' 
     BEGIN 
      PRINT 'Tables must begin with the prefix tbl' 

      ROLLBACK 
     END 
    END 

GO