Wróce do tematu.
Mam na bazie zrobiony trigger, który blokuję możliwość usunięcia zamówienia w buforze. Chciałbym go przebudować, abym ja mógł go usuwać.
use baza_erpxl
go
ALTER TRIGGER [CDN].[ZamNag_Delete]
ON [CDN].[ZamNag]
INSTEAD OF DELETE
AS
RAISERROR('#CDN_INFO/# #CDN_1=Zamówienia nie można usunąć. Prawidłowy sposób: potwierdź a następnie anuluj. /# #CDN_2=Wywołany został wyzwalacz na tabeli CDN.ZamNag uniemożliwiający usuwanie zamówień. Pytania proszę kierować na pomoc@prefix.pl /#',16,1);
ROLLBACK TRANSACTION
END
Chciałem zrobić modyfikację, aby usuwający o identyfikatorze 'M_PK' miał prawo do usunięcia zamówienia.
use baza_erpxl
go
ALTER TRIGGER [CDN].[ZamNag_Delete]
ON [CDN].[ZamNag]
INSTEAD OF DELETE
AS
BEGIN
IF EXISTS (
SELECT * from deleted as d
inner join cdn.sesje as s ON s.ses_sesjaid = d.ZaN_Aktywny
where s.ses_opeident <> 'M_PK'
)
RAISERROR('#CDN_INFO/# #CDN_1=Zamówienia nie można usunąć. Prawidłowy sposób: potwierdź a następnie anuluj. /# #CDN_2=Wywołany został wyzwalacz na tabeli CDN.ZamNag uniemożliwiający usuwanie zamówień. Pytania proszę kierować na pomoc@prefix.pl /#',16,1);
ROLLBACK TRANSACTION
END
No i niestety nic z tego. Nie wiem już co robię źle. Może mi ktoś pomóc?
use baza_erpxl
go
ALTER TRIGGER [CDN].[ZamNag_Delete]
ON [CDN].[ZamNag]
INSTEAD OF DELETE
AS
BEGIN
IF EXISTS (
select * from deleted where zan_openumermod <> 707 -- GIDNumer usera M_PK
)
RAISERROR('#CDN_INFO/# #CDN_1=Zamówienia nie można usunąć. Prawidłowy sposób: potwierdź a następnie anuluj. /# #CDN_2=Wywołany został wyzwalacz na tabeli CDN.ZamNag uniemożliwiający usuwanie zamówień. Pytania proszę kierować na pomoc@prefix.pl /#',16,1);
ROLLBACK TRANSACTION
END
A sprawdź kto w takim zamówieniu jest Operatorem mdyfikującym?
Select zan_openumermod from cdn.zamnag where zan_gidnumer = ....
Na bank zan_openumermod <> 707
Wiesz jak działają triggery Instead of, czy tak po prostu sobie taki wybrałeś? Przy operacji Delete, dane są tylko w tabeli deleted dla DML triggerów, więc jesteś pewien, że jest tam operator, który w danym momencie usuwa zamówienie?
Wiem jak działają. To może inaczej, bo wiem gdzie robię błąd.
Chcę uzyskąć taki efekt, aby ope_ident = 'M_PK' mógł usuwać zamówienia, a pozostali nie mogli.
Jest to możliwe?
Mam napisany tylko trigger na UPDATE, który działa na 100%. Na DELETE nie mam. Poniżej cały kod - tak żeby było wiadomo co ten trigger robi i dlaczego. Może napiszesz sobie coś na wzór...
ALTER TRIGGER [CDN].[BlokadaZamknieciaZS] ON [CDN].[ZamNag]
FOR UPDATE
AS
SET NOCOUNT ON
DECLARE @OpeMod INT, @OpePotw Int
SELECT @OpePotw = ZaN_OpeNumerP FROM deleted
SELECT @OpeMod = ZaN_OpeNumerMod FROM inserted
IF
@OpePotw <> @OpeMod AND
@OpeMod <> 77 AND -- ABC
@OpeMod <> 38 AND -- XYZ
AND EXISTS
(
SELECT * FROM inserted
INNER JOIN deleted ON (inserted.ZaN_GIDNumer = deleted.ZaN_GIDNumer AND inserted.ZaN_GIDTyp = deleted.ZaN_GIDTyp)
WHERE (inserted.ZaN_ZamTyp IN (1280) AND inserted.ZaN_Rodzaj IN (4))
AND
(
(inserted.ZaN_Stan = 53 AND deleted.ZaN_Stan = 5) OR
(inserted.ZaN_Stan = 51 AND deleted.ZaN_Stan = 3)
)
AND
(
inserted.ZaN_FrSID = 9 OR -- X
inserted.ZaN_FrSID = 12 OR -- Y
)
)
BEGIN
RAISERROR('#CDN_BLAD/# #CDN_1=Nie możesz zamknać ZS-a, który nie jest potwierdzony przez ciebie/# #CDN_2=/# #CDN_3=/#', 16, 1)
ROLLBACK TRAN
END
SET NOCOUNT OFF
Trigger Wieśka nie zadziała w twoim przypadku, ponieważ w momencie usuwania rekordu, nie ma wypełnionej tabeli inserted z informacją o użytkowniku, który dokonuje zmian (bo nie są to zmiany, tylko usunięcie rekordu). To co możesz zrobić, to spiąć tabelę deleted z tabelą CDN.Sesje i na tej podstawie identyfikować operatora, który usuwa rekord. Ewentualnie skorzystać z @@SPID, co również pozwoli na taką identyfikacje usera(z tym, że w tym przypadku nie jest to niezbędne, ponieważ masz pole Zan_Aktywny i pierwszy sposób będzie prostszy w implementacji).
CREATE TRIGGER CDN.TraNag_PrzykladFunkcjiPolaczenieInfo
ON [CDN].[TraNag] FOR UPDATE
AS
SET
NOCOUNTON
--
"Blokada zmiany daty wystawienia WZ/FS na wcześniej szą niż bieżący miesiąc"
IF UPDATE (rN_Data2)
BEGIN
IF EXISTS(SELECT * FROM inserted WHERE inserted.TrN_GIDTyp IN (2001,2033) AND MONTH(DATEADD(d,CAST(TrN_Data2 AS DECIMAL),'18001228'))<MONTH(GetDate())
--Wykluczeni operatorzy z działania triggera
AND CDN.PlaczenieInfo(4) NOT IN ('ADMIN'))
BEGIN
RAISERROR('#CDN_BLADK/# #CDN_1=Data wystawienia z poprzedniego miesiąca./# #CDN_2=Na tym dokumencie data wystawienia nie może być wcześniejsza niż bieżący miesiąc./# #CDN_3=Zmień datę wystawienia na bieżący miesiąc lub poprośo zapisanie dokumentu osobę uprawnioną./#',16, 1)
ROLLBACK TRAN
SET
NOCOUNT OFF
RETURN
END
END
SET
NOCOUNT OFF