SQL-Trigger, unterschiedliches Verhalten zwischen Adminkonto und StandardUser-Konto

Status
Für weitere Antworten geschlossen.

kwells

Benutzer
Beiträge
15
Hallo, Guten Abend, Karl mein Name.

Der String für den Trigger sieht so aus, wie weiter unten gepostet, wird erzeugt in dieser Umgebung
- Win7 64bit
- MsSQL-Server 2008 R2

Wenn ich diese Tabelle "tblTesttmp" unter meinem Standard-Userkonto öffne, dann hat sie nur ein Zeile, soweit OK.
Ich ändere den Eintrag im Feld Stunden, setze den Curser in ein anderes Feld und es erscheint der berühmte rote Punkt mit dem weissen Ausrufezeichen und die Message lautet: "Die Zeile hat sich geändert. Die Änderung wurde
nicht an die Datenbank weiter gegeben."

Tu ich dasselbe auf meinem Adminkonto(selbe Rechenmaschiene, selbe Datenbank,alles dasselbe), dann erscheint nach Änderung zwar auch dieser rote Punkt, mit dem selben Hinweis, aber die Änderung wird vollzogen.

Was kann das sein? Hat jemand eine Idee?
Wenn es am Trigger SQL-Code liegt würde ich mit meinem bescheidenen Wissen annehmen, dass dann beide Konten die Änderung verweigern,oder? Ich wüsste deshalb auch nicht wo hier ansetzen.

Gruss Karl

Code:
ALTER Trigger [dbo].[myTestrigger] ON [dbo].[tblTesttmp] for insert, 
update as 
DECLARE @insPk Int
DECLARE @delPk Int
DECLARE @insStunden Int
DECLARE @delStunden Int
DECLARE @insTage Int
DECLARE @delTage Bit

SELECT @insPk  = inserted.IDPK from inserted 
SELECT @delPk  = deleted.IDPK from deleted  
SELECT @insStunden  = inserted.StundenTmp from inserted 
SELECT @delStunden  = deleted.StundenTmp from deleted
SELECT @insTage  = inserted.TageTmp from inserted 
SELECT @delTage  = deleted.TageTmp from deleted 

UPDATE tblTesttmp SET  Stunden=@insStunden, Tage=@insTage 
WHERE @insPk = IDPK And @delStunden=Stunden  And @delTage=Tage
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Der berühmte rote Punkt? Kann nicht so berühmt sein... Noch nie davon gehört... Schonmal Berechtigungen überprüft ? Vllt. darf der User einfach nicht schreiben?
 
Muss ich leider Nein sagen, ist zwar naheligend da nachzushen, hab ich aber nicht.
Hab jetzt nachgesehen und für die tblTesttmp ist keine Berechtigung gesetzt, nicht nur dass keine Haken gesetzt sind, es wird gar keine Auflistung angezeigt.
Dies kann ich zwar ändern durch hinzufügen einer Rolle(public) und dann die Berechtugunge setzten, aber das scheint ein riesen Unterschied zu 2000 zu sein.
Ich hatte die tblTesttmp via Script erstellt. Via Mausklick mir das script für die tblTest geben lassen und dasscript ausgeführt.
Dabei werden die Rechte nicht übernommen? Lässt sich das eventuell einstellen, dass Rechte übernommen werden?

Gruss Karl
 
Nach setzen einer Rolle für die tmp Tabelle und den Berechtigungen, läuft es jetzt. Alle Änderungen werden übernommen, auch über Trigger.
Der rote Punkt, den keiner kennt, der ist mir geblieben, der verschwindet erst wenn ich den Mauszeiger in die nächste Zeile setze.

Aber,
nehm ich die tmp Tabelle in eine View, nur diese, dann werden Änderunge wieder verweigert. Es sei denn ich entferne den Trigger.
Was kann das sein?
 
Grundstäzlich geht kein Insert / Update in eine View...

Pfffff...

Code:
test=*# create table foo (id int primary key, val text);
CREATE TABLE
test=*# insert into foo values (1, 'test1');
INSERT 0 1
test=*# create view view_foo as select * from foo;
CREATE VIEW
test=*# insert into view_foo values (2, 'test2');
INSERT 0 1
test=*# update view_foo set val = 'test1111111' where id = 1;
UPDATE 1
test=*# select * from foo;
 id |  val
----+-------------
  2 | test2
  1 | test1111111
(2 rows)
 
Ja, es geht... Aber eine View die "Select *" widerspiegelt, wird man bei dir hoffentlich nicht finden ;)

In allen anderen Fällen:
Code:
SQL>
SQL> create table max_test
  2  (
  3   id Varchar2(12),
  4   some_value Number
  5  );
Table created

SQL>
SQL> Create View max_test_view01 As
  2  Select id
  3        ,some_value
  4  From   max_test;
View created

SQL>
SQL> Create View max_test_view02 As
  2  Select id
  3        ,Sum(some_value) As some_value
  4  From   max_test
  5  Group  By id;
View created

SQL>
SQL> Create View max_test_view03 As
  2  Select id
  3        ,Case
  4            When some_value > 10 Then
  5             1
  6            Else
  7             0
  8         End As some_value
  9  From   max_test;
View created

SQL> Insert Into max_test_view01 Values ('a', 1);
1 row inserted

SQL> Insert Into max_test_view02 Values ('b', 2);
Insert Into max_test_view02 Values ('b', 2)
ORA-01733: Virtuelle Spalte hier nicht zulässig

SQL> Insert Into max_test_view03 Values ('c', 3);
Insert Into max_test_view03 Values ('c', 3)
ORA-01733: Virtuelle Spalte hier nicht zulässig

SQL>
 
Ja, es geht... Aber eine View die "Select *" widerspiegelt, wird man bei dir hoffentlich nicht finden

selbst wenn: PostgreSQL würde die View-Definition korrekt speichern ;-)

Code:
test=# create table foo (id int primary key, val text);
CREATE TABLE
test=*# create view view_foo as select * from foo;
CREATE VIEW
test=*# \d view_foo
  View "public.view_foo"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer |
 val  | text  |

test=*# \d+ view_foo
  View "public.view_foo"
 Column |  Type  | Modifiers | Storage  | Description
--------+---------+-----------+----------+-------------
 id  | integer |  | plain  |
 val  | text  |  | extended |
View definition:
 SELECT foo.id,
  foo.val
  FROM foo;

test=*#
 
Es geht mir ja weniger darum wie Sie gehandhabt ist... Als viel mehr darum das so eine View einfach unnötig ist. Lässt einfach nur den Optimizer mehr arbeit machen, als er eigentlich machen muss... Selbst wenn man explizit alle Spalten angibt...

Der einzige Grund warum man vllt. eine "Select *"-View haben will ist so etwas:
Code:
Create view max_test_view04 As
Select id,
            some_value
From max_test
With Read Only;
Aber man sieht was man damit verhindern will...
(Wobei sich das meistens über Berechtigungen bzw. Frontend regelt)
 
Was der Trigger genau macht.. wenn Du mir sagts was dir in der Eingangsfrage fehlt, dann schreib ich gerne mehr. Die Eingangsfrage hat den Triggercode, besser beschreiben was der Trigger macht, - wüsste nicht wie?

Die Message heisst(nur bei Verwendung der Tabelle in einer View): Die aktualisierten oder gelöschten Zeilenwerte machen die Zeile nicht eindeutig oder ändern mehrere Zeilen.

Und die Tabelle hat nur ein Zeile, dass mehrere Zeilen aktualisiert werden scheidet aus,
 
1: Ohja... Das Scrollrad ist eine mächtige Waffe... Sry :)
2: Ich versteh grade nur Bahnhof. Nicht nur was den eigentlichen Fehlerfall betrifft... sondern auch auf deinen Trigger bezogen...

Soweit ich das verstehe macht der Trigger einfach... nunja.... nichts? (Davon abgesehen das er in einer Endlosschleife enden sollte... ?)
Auch den Umstand, dass das zusätzliche Update auf eine ganze andere Tabelle referenzieren kann, mal außer acht gelassen (Du weißt schon... Schema nicht vorhanden :) )
 
das Scrollrad eine Waffe?, naja...

Der Duktus der Antwort liegt so auf... Hallo guck mal wie clever ich doch bin...

Deshalb helf ich doch gerne nochmal nach.
Das mit dem Scrollrad orde ich ein als, - da hat einer was rausjefunnnn, durch die IP-Adressen mit denen ich hier angemeldt war., viel mehr fällt mir da nicht ein. Nutze aber gerne die Gelegenheit zur Horizont Erweiterung. In dem Tool das ich verwende, sind immer ca. 15 versch IPs verfügbar, die man man jeder Zeit beliebig auswählen kann. Auf den kostelos verfügbaren IPs surfen im Schnitt 300 andere User neben mir.

Das Ding ist ganz einfach zu handhaben, was ich da beschreibe ist für jeden ohne weiteres einsehbar, eigentlich. Bin aber immer wieder überrascht wie sehr Forenbegegnungen zwar daran rumfummeln (sobald sie merken da ist einer via Proxy oder sonstiges angemeldet) dann aber doch sich mit den erst besten Folgerungen zufrieden geben und das dann auch noch auf so komische weise durchblicken lassen, mit diesem ätsch bätsch dachtets wohl kannst uns verarsc...
 
Werbung:
Das mit dem Scrollrad war eher darauf bezogen, das man hätte ja auch mal hochscrollen können und sich deine älteren Beiträge nochmal hätte durchlesen sollen, bevor man eine Frage stellt... Wie du da auf IP-Adressen kommst ist mir gerade leider etwas schleierhaft? Und wie kommst du darauf das ich wüsste mit welcher IP du wann hier im Forum aktiv warst?... Ich verstehe immer weniger und weniger...

Und ich wiederhole mich...
Was SOLL dein Trigger machen? Denn so wie du ihn gepostet hast... macht er mMn nichts :)
Sobald man ein Update gegen diese Tabelle schickt, nimmt er sich die neuen Werte und schickt ein weiteres Update, und wieder, und wieder, und wieder, und wieder (Bis man irgendwann am Rande des Nirvanas angekommen ist und die DB keine Lust mehr hat)... Oder übersehe ich gerade etwas wirklich wichtiges?
Wie, dass der "dbo"-Alias absichtlich fehlt und du damit dann eine user-spezifische Replik der Tabelle gleichziehen willst ? Nein... Spätestens bei einem Insert wäre dein Gedankengang zu Ende... Da die neuen IDs fehlen würden... Also WAS willst du mit dem Ding? Ich versteh es immer noch nicht so wirklich und ich sehe auch keinen einzigen sinnvollen Ansatz...

Und man muss nichts reparieren was in erster Linie nicht da sein sollte... Oder sehe ich da auch etwas falsch?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben