In Trigger auf temporäre Tabelle zugreifen

26/03/2008 - 21:21 von Matthias Schuppe | Report spam
Hallo zusammen,

ich habe eine Anwendung mit "eigener" Benutzerverwaltung, für die
ich nun eine Änderungsverfolgung implementieren darf. Es gibt im
Client eine "BenutzerID", die ich irgendwie in die Änderungs-Tabelle
kriegen muss. Folgendes habe ich mir überlegt:

Zunàchst rufe ich diese Prozedur auf:

CREATE PROCEDURE dbo.BenutzerINITIALISIEREN
@intID int
AS
BEGIN
IF (OBJECT_ID(N'tempdb..#Benutzer') IS NULL)
BEGIN
CREATE TABLE #Benutzer (
ID int
)
END
ELSE
BEGIN
DELETE #Benutzer
END
INSERT INTO #Benutzer (
ID)
VALUES (
@intID)
END

Dann würde ich einen Trigger beispielsweise so gestalten:

CREATE TRIGGER dbo.Trigger ON dbo.Tabelle
WITH EXECUTE AS CALLER
FOR UPDATE
AS
DECLARE @intBenutzerID int
BEGIN
SELECT @intBenutzerID = ID
FROM #Benutzer
INSERT INTO dbo.Aenderungen (
BenutzerID)
VALUES (
@intBenutzerID)
END

Bei Änderungen erhalte ich aber die Fehlermeldung "Ungültiger
Objektname '#Benutzer'". Offenbar kann man vom Trigger aus nicht auf
die temporàre Tabelle zugreifen. Ist dem wirklich so? Hat jemand eine
Idee hierzu?

Gruß,

Matthias
 

Lesen sie die antworten

#1 Uwe Ricken
26/03/2008 - 22:07 | Warnen spam
Hallo Matthias,

ich weiß zwar nicht genau, was Du da eigentlich machen willst aber ich halte
das Konzept für sehr fragwürdig. Statt mit temporàren Tabellen für Dein
Beispiel solltest Du lieber mit einer regularen Tabelle arbeiten, in der
neben der Id auch der Username (suser_sname oder user_name) gespeichert
wird.
Daraus erstellst Du eine View, mit der Du arbeitest.

Beispiel:

CREATE TABLE dbo.tbl_sys_UserInit
(
Username sysname NOT NULL DEFAULT (user_name()),
Id int NULL,

CONSTRAINT pk_tbl_sys_userinit PRIMARY KEY (username)
)
GO


CREATE VIEW dbo.view_app_UserInit
WITH ENCRYPTION
AS
SELECT Id
FROM dbo.tbl_sys_UserInit
WHERE UserName = user_name()
GO

GRANT SELECT ON dbo.view_app_UserInit TO public
GO

CREATE TRIGGER dbo.Trigger ON dbo.Tabelle
FOR UPDATE
AS
SET NOCOUNT ON

INSERT INTO dbo.Aenderungen(BenutzerId)
SELECT Id FROM dbo.view_app_UserInit

SET NOCOUNT OFF
GO

Mit dem obigen Script kannst Du nun in Deinen Triggern einfach auf die View
dbo.view_app_UserInit zugreifen und mußt auch nicht mehr einen Benutzernamen
als Parameter übergeben.

Neben der besseren Lesbarkeit des Codes hast Du zwei Fliegen mit einer
Klappe geschlagen:

- Vereinfachung
- Sicherheit

HTH ;-)


Gruß, Uwe Ricken
MCP for SQL Server 2000 Database Implementation

db-Berater GmbH - 64390 Erzhausen
http://www.db-berater.de
http://www.memberadmin.de
http://www.conferenceadmin.de
____________________________________________________
dbdev: http://www.dbdev.org
FAQ: http://www.donkarl.com/AccessFAQ.htm

Ähnliche fragen