Was ist der beste Weg, um zu definieren, eine benannte Konstante in SQL?

Wenn einen "Konstanten" Wert ist erforderlich, in mehreren gespeicherten Prozeduren und Funktionen in einer Datenbank, ist es einen standard zu definieren, der es in einem Ort, so ist es überall verfügbar?

Angenommen, ich benutze xp_logevent im CATCH block, etwas zu schreiben in das Ereignisprotokoll, wenn RAISERROR passiert, aber ich möchte die Gruppe die schwere in Information, Warnung und Fehler auf der Grundlage der RAISERROR Schweregrad.

Konnte ich eine Konstante EventSeverity so dass:

  • wenn RAISERROR Schweregrad = 0 dann xp_logevent dient nur zu Informationszwecken.
  • wenn RAISERROR schwere <= EventSeverity als xp_logevent ist Warnung.
  • wenn RAISERROR schwere > EventSeverity als xp_logevent error.

Den cut-off zwischen Warnung und Fehler Schweregrad ist unwahrscheinlich, dass zu ändern, aber wenn es überhaupt nicht ich will es ändern nur an einem Ort.

Dachte ich an diese Möglichkeiten:

  • Verwenden Sie ein " @@variable ' um den Wert zu speichern.

    • Vorteile: Niedrige zugreifen overhead. Einfach zugänglich-code.
    • Nachteile: Erlegt Ausführung bestellen, muss die variable deklariert werden und vor anderen Prozeduren und Funktionen zugreifen kann. Ändern des Werts mittels code ändern.

      DECLARE @@EventSeverity INT = 9
      ...
      BEGIN CATCH
          IF ERROR_SEVERITY() < @@EventSeverity
              ...
          ELSE
              ...
      END CATCH
  • Eine Funktion verwenden, um den Rückgabewert.

    • Vorteile: Relativ geringe Arbeitsspeicher. Einfach zugänglich-code.
    • Nachteile: Ändern des Werts mittels code ändern.

      CREATE FUNCTION dbo.EventSeverity()
      RETURNS INT
      AS
      BEGIN
          RETURN 9
      END
      ...
      BEGIN CATCH
          IF ERROR_SEVERITY() < dbo.EventSeverity()
              ...
          ELSE
              ...
      END CATCH
  • Verwendung "Einstellungen" - Tabelle um den Wert zu speichern.

    • Vorteile: die Änderung Wert bedeutet, dass Daten, die sich ändern.
    • Nachteile: Hohe Arbeitsspeicher. Schwierig, wenn der Zugriff im code. Schwer zu verwenden, als parameter. Benutzer könnte den Wert ändern.

      CREATE TABLE dbo.Settings
      (
          Name VARCHAR(...),
          Value VARCHAR(...)
      )
      ...
      INSERT INTO dbo.Settings (Name, Value)
      VALUES ('EventSeverity', CAST(9 AS VARCHAR))
      ...
      BEGIN CATCH
          IF ERROR_SEVERITY() < (SELECT CAST(Value AS INT) FROM dbo.Settings WHERE Name = 'EventSeverity')
              ...
          ELSE
              ...
      END CATCH
  • Verwendung "Einstellungen" - Tabelle mit einer Funktion, die den Zugriff erleichtern.

    • Vorteile: Einfach, um den Wert zu ändern. Einfach zugänglich-code.
    • Nachteile: Hoher Aufwand. Benutzer könnte den Wert ändern.

      CREATE TABLE dbo.Settings
      (
          Name VARCHAR(...),
          Value VARCHAR(...)
      )
      ...
      INSERT INTO dbo.Settings (Name, Value)
      VALUES ('EventSeverity', CAST(9 AS VARCHAR))
      ...
      CREATE FUNCTION dbo.EventSeverity()
      RETURNS INT
      AS
      BEGIN
          DECLARE @result INT
          SET @result = (SELECT CAST(Value AS INT) FROM dbo.Settings WHERE Name = 'EventSeverity')
          IF @result IS NULL
              SET @result = 9
          RETURN @result
      END
      ...
      BEGIN CATCH
          IF ERROR_SEVERITY() < dbo.EventSeverity()
              ...
          ELSE
              ...
      END CATCH

Gibt es eine best-practice-Weg, dies zu tun?

  • Siehe auch hier : stackoverflow.com/questions/3370737/...
  • wenn es eine Anwendung bestimmte Konstante, würde ich wählen, um zu verwenden, eine dbo.Einstellungen-Ansatz und sicherzustellen, dass die Sicherheit Modell auf dem Tisch verhindert, dass änderung und damit den Anforderungen der Integrität der Konstante.
InformationsquelleAutor WileCau | 2011-12-09
Schreibe einen Kommentar