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 dannxp_logevent
dient nur zu Informationszwecken. - wenn
RAISERROR
schwere <=EventSeverity
alsxp_logevent
ist Warnung. - wenn
RAISERROR
schwere >EventSeverity
alsxp_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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle sonst seiend gleich, ich würde die Regeln für die hart codierte FUNKTION, für die Leistung. Für die Sicherheit, sollte diese Funktion in einem eindeutigen SCHEMA, wie "MeineDatenbank".CONF.SettingsFunc statt der üblichen DBO; mit den Berechtigungen dieses schema, so dass nur die Administratoren haben die Berechtigung zum ändern von Daten.
Wenn Sie brauchen, um zu zentralisieren verschiedenen Konfigurations-Einstellungen für viele verschiedene verwendet, dann wird der Letzte Ansatz (FUNKTION+TISCH) hätte eine größere Anziehungskraft, die Sie einen index erstellen, der für jeden Anwendungsfall. Ebenfalls, diese "Einstellungen" - Tabelle in einem eingeschränkten schema, im Gegensatz zu der Funktion, die könnte bleiben in der Standard-schema für einfache Codierung.
Aber, wenn es zwingend ist, dass das Standard-schema verwendet werden, wird es interessant zu konfigurieren, ein "INSTEAD OF UPDATE-trigger in dieser "Einstellungen" - Tabelle, damit der Benutzer nicht ändern würde, die Daten einfach; vergessen Sie nicht, dass dieser Letztgenannte Ansatz kann nicht aufgerufen werden, "Sicherheit", wie der Benutzer könnte sich noch ändern (oder drop!) der trigger.