2017-01-15 12 views
1

Ich versuche, um sicherzustellen, dass, wenn die Leute Tabellen erstellen Sie es mit dem Präfix beginnt tblkann nicht in SQL Server zu vergleichen, scheinen in varchar

Hier ist, was ich ab jetzt tat:

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 

Das Problem ist, dass es mich nicht != Operator verwenden lässt. Ich versuchte mit =<> oder LIKE, aber nichts scheint zu funktionieren, es hält mich darauf hingewiesen, dass die Syntax falsch ist bitte helfen, ich sah überall online und jeder sagt, dass = oder LIKE arbeiten. :(

+0

Nun, wenn Sie wie ich dumm sind und nicht wissen, wie Ihr Problem erinnern dix Sie wie so SELECT zu schließen (SUBSTRING SELECT (@ name, 1,3))! = ‚Tabl‘ Dann wird alles in Ordnung –

Antwort

2

Fehler ist wegen einer fehlenden schließenden Klammer an:

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

kann durch Hinzufügen der fehlenden Schließbügel befestigt werden:

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

Allerdings brauchen Sie nicht zu tun wählen Teilzeichenfolge auszuführen

Sie dies tun können.

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

Thx Jungs jetzt, dass es beantwortet wurde, muss ich es schließen oder eine antwortende Box überprüfen. ??? Neu auf dieser Seite –

+0

Sie müssen die Antwort akzeptieren. Klicken Sie einfach auf die Markierung unten auf den Wähltasten – Hadi

+0

@TristanClaude setzen Sie diese Antwort als akzeptiert, wie dieser Screenshot

3

Obwohl die andere Antwort das Problem in Ihrem Code erklärt. Ich werde vorschlagen, dass Sie Eventdata() Funktion verwenden Tabellenname Ihr DDL Trigger

Auch wird zum Abrufen rollback jeder Create Table Aktion obwohl der Tabellenname mit tb1 beginnt. Sie müssen rollback nur anwenden, wenn der Tabellenname nicht mit tb1 beginnt. Verschieben Sie den Rollback-Befehl in den Zustand IF.

Verwenden Sie BEGIN-END Block, wenn IF Bedingung hat mehr als eine Aussage sonst die erste Anweisung allein wird innerhalb der IF Bedingung berücksichtigt.

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 
Verwandte Themen