{"id":99,"date":"2011-04-17T18:21:44","date_gmt":"2011-04-17T18:21:44","guid":{"rendered":"http:\/\/www.flip-design.de\/?p=99"},"modified":"2011-04-17T18:21:44","modified_gmt":"2011-04-17T18:21:44","slug":"server-trigger-logon-trigger","status":"publish","type":"post","link":"https:\/\/www.flip-design.de\/?p=99","title":{"rendered":"Server Trigger: Logon Trigger"},"content":{"rendered":"<p><a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dbtrigger_perm.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-61\" title=\"dbtrigger_perm\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dbtrigger_perm.png\" alt=\"\" width=\"131\" height=\"157\" \/><\/a>In diesem Blog Eintrag geht es um Logon-Trigger. Analog zu den Einstell-M\u00f6glichkeiten im Microsoft Active Directory, wo man Benutzern verschiedene Zeiten voreinstellen kann, wann eine Anmeldung m\u00f6glich ist, kann dies auch im SQL Server nachvollzogen werden.<\/p>\n<p>Hierf\u00fcr ist lediglich eine kleine Infrastruktur notwendig. Eine Verwaltungsdatenbank in der die Benutzer gespeichert werden, wie auch eine Tabelle in der die Zeiten definiert werden.<\/p>\n<p>In folgendem Beispiel wird die Verwaltungsdatenbank erstellt mit einer Benutzertabelle in der die Benutzernamen gespeichert werden, eine Gruppentabelle um Benutzer zu Gruppen hinzuzuf\u00fcgen die gleichzeitig die Zeiten definieren.<\/p>\n<p>Mit diesem Code wird die Benutzer Tabelle erzeugt. Hier werden lediglich die Benutzernamen gespeichert:<br \/>\n<code>create table dbo.benutzer (<br \/>\nuid uniqueidentifier default newid() primary key not null,<br \/>\nbenutzername varchar(255) not null unique);<br \/>\ngo<\/code><\/p>\n<p>Hier noch 2 Benutzer:<br \/>\n<code>insert into benutzer (benutzername) values ('Herta');<br \/>\ninsert into benutzer (benutzername) values ('Kerrin');<br \/>\ngo<\/code><\/p>\n<p>Um das Beispiel testen zu k\u00f6nnen, empfiehlt es sich auch diese Benutzer als SQL Authentifizierte Accounts auf dem Server anzulegen und der Datenbank zuzuordnen.<\/p>\n<p>Nun wird die Gruppen Tabelle erstellt. \u00dcber die Felder Beginn- und Endzeit wird die Zeit definiert, wo eine Anmeldung m\u00f6glich ist.<br \/>\n<code>create table dbo.gruppen (<br \/>\nuid uniqueidentifier default newid() primary key not null,<br \/>\ngruppenname varchar(255) not null unique,<br \/>\nbeginnzeit time not null,<br \/>\nendzeit time not null);<br \/>\ngo<\/code><\/p>\n<p>Nun werden noch 3 Gruppen angelegt:<br \/>\n<code>insert into gruppen (gruppenname, beginnzeit, endzeit) values ('Vormittag', '07:00', '12:30');<br \/>\ninsert into gruppen (gruppenname, beginnzeit, endzeit) values ('Nachmittag', '12:30', '18:30');<br \/>\ninsert into gruppen (gruppenname, beginnzeit, endzeit) values ('Vollzeit', '07:00', '18:30');<br \/>\ngo<\/code><\/p>\n<p>Zuletzt wird noch die Zuordnungstabelle erstellt:<br \/>\n(F\u00fcr die \u00dcbersicht habe ich hier die Referentiellen Integrit\u00e4ten nicht erstellt)<br \/>\n<code>create table bennutzer_gruppen (<br \/>\nbenutzer_uid uniqueidentifier not null,<br \/>\ngruppen_uid uniqueidentifier not null);<br \/>\ngo<\/code><\/p>\n<p>Nun werden die Benutzer noch jeweils einer Gruppe zugeordnet:<br \/>\n(Beim Test m\u00fcssen die ID&#8217;s angepasst werden)<br \/>\n<code>insert into bennutzer_gruppen values ('E4727227-7C64-46E0-8233-CE0A249AAAB5', 'D319D6EA-D280-4E65-8AC6-823100270667');<br \/>\ninsert into bennutzer_gruppen values ('ED3EEA47-E4BA-4E82-A6E7-D5A69E991C95', 'F5D9E222-98BE-455A-B5B5-62096CA254EE');<br \/>\ngo<\/code><\/p>\n<p>Nun wird noch eine View erstellt, die die Benutzer zu den jeweligen Gruppen ausgibt:<br \/>\n<code>create view benutzerInGruppen as<br \/>\nSELECT\u00a0\u00a0\u00a0\u00a0 benutzer.benutzername, gruppen.gruppenname, gruppen.beginnzeit, gruppen.endzeit<br \/>\nFROM\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bennutzer_gruppen INNER JOIN<br \/>\nbenutzer ON bennutzer_gruppen.benutzer_uid = benutzer.uid INNER JOIN<br \/>\ngruppen ON bennutzer_gruppen.gruppen_uid = gruppen.uid<br \/>\ngo<\/code><\/p>\n<p>Ergebnis:<br \/>\n<a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/benutzeringruppen.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-100\" title=\"benutzeringruppen\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/benutzeringruppen.png\" alt=\"\" width=\"411\" height=\"58\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/benutzeringruppen.png 411w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/benutzeringruppen-300x42.png 300w\" sizes=\"(max-width: 411px) 100vw, 411px\" \/><\/a><\/p>\n<p>F\u00fcr den Trigger wird hier noch eine weitere View erstellt, die pr\u00fcfen soll, ob es den Benutzer auch gibt:<br \/>\ncreate view benutzernamen as<br \/>\n<code>SELECT benutzername FROM benutzer WHERE benutzername = SUSER_NAME()<br \/>\ngo<\/code><\/p>\n<p>Damit die Benutzer beim Login auch pr\u00fcfen k\u00f6nnen, ob ein Login m\u00f6glich ist, wird noch eine Rolle erstellt die auf die beiden Sichten berechtigt und die Benutzer werden dieser Rolle hinzugef\u00fcgt:<br \/>\n<code>create role benutzer;<br \/>\ngrant select on benutzerInGruppen to benutzer<br \/>\ngrant select on benutzernamen to benutzer<br \/>\nexec sp_addrolemember benutzer, herta;<br \/>\nexec sp_addrolemember benutzer, kerrin;<br \/>\ngo<\/code><\/p>\n<p>Ob die Datenbank Infrastruktur stimmt, kann mit folgenden Code \u00fcberpr\u00fcft werden:<br \/>\n<code>EXECUTE AS LOGIN = 'kerrin'<br \/>\nSELECT * FROM benutzernamen<br \/>\nREVERT<\/code><br \/>\nHiermit wird die Abfrage unter dem angegeben Benutzerkontext ausgef\u00fchrt.<\/p>\n<p>Nun wird der Servertrigger erstellt. Server Trigger befinden sich im SSMS hier:<br \/>\n<a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/logontrigger_location.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-101\" title=\"logontrigger_location\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/logontrigger_location.png\" alt=\"\" width=\"232\" height=\"227\" \/><\/a><\/p>\n<p>Der Trigger soll folgende Voraussetzungen erf\u00fcllen:<\/p>\n<ul>\n<li>Benutzer die nicht in der Tabelle definiert sind, sollen vom Trigger ausgenommen werden<\/li>\n<li>Nur Benutzer die sich im Zeitfenster befinden d\u00fcrfen sich anmelden<\/li>\n<\/ul>\n<p>Nun der Code:<br \/>\n<code>CREATE trigger benutzerAnmeldung on ALL SERVER<br \/>\nfor LOGON<br \/>\nas<br \/>\nbegin<br \/>\nDECLARE @result INT<br \/>\nIF((SELECT COUNT(*) from LogonTime.dbo.benutzernamen) &gt; 0)<br \/>\nBEGIN<br \/>\nselect @result = COUNT(*) from LogonTime.dbo.benutzerInGruppen<br \/>\nwhere benutzername = SUSER_SNAME()<br \/>\nAND (<br \/>\nbeginnzeit &lt;= CONVERT(time, GETDATE()) \t\t\t\tAND \t\t\t\tendzeit &gt;= CONVERT(time, GETDATE()))<br \/>\nIF(@result = 0)<br \/>\nBEGIN<br \/>\nROLLBACK;<br \/>\nEND<br \/>\nEND<br \/>\nEND;<br \/>\ngo<\/code><\/p>\n<p>Nun kann man den Logon mit einem Benutzernamen testen. Befindet man sich in dem Zeitfenster funktioniert eine Anmeldung, ansonsten wird man durch folgende Meldung begr\u00fc\u00dft:<br \/>\n<a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/logon1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-102\" title=\"logon1\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/logon1.png\" alt=\"\" width=\"527\" height=\"38\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/logon1.png 527w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/logon1-300x21.png 300w\" sizes=\"(max-width: 527px) 100vw, 527px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Blog Eintrag geht es um Logon-Trigger. Analog zu den Einstell-M\u00f6glichkeiten im Microsoft Active Directory, wo man Benutzern verschiedene Zeiten voreinstellen kann, wann eine Anmeldung m\u00f6glich ist, kann dies auch im SQL Server nachvollzogen werden. Hierf\u00fcr ist lediglich eine &hellip; <a href=\"https:\/\/www.flip-design.de\/?p=99\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[10,7,3],"tags":[],"_links":{"self":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/99"}],"collection":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=99"}],"version-history":[{"count":2,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/99\/revisions"}],"predecessor-version":[{"id":104,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/99\/revisions\/104"}],"wp:attachment":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=99"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=99"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=99"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}