Trigger tworzący tabele

0

Witam, zwracam się do Was drodzy forumowicze z prośbą o pomoc w napisaniu triggera do bazy danych, który w przypadku obsłużenia więcej niż 4 pacjentów przez danego lekarza w ciągu danego dnia zapisze w specjalnej tabeli wiadomość, że ten właśnie lekarz obsłużył więcej niż 4 pacjentów. Poniżej prezentuje schemat bazy oraz to co próbowałem pisać

 create table Pacjenci (
Id int primary key,
Imie varchar(25),
Nazwisko varchar(25))


Insert into Pacjenci values
(1,'Anna','Pierwsza'),
(2,'Tomasz','Drugi'),
(3,'Krzysztof','Trzeci'),
(4,'Jan','Czwarty'),
(5,'Cezary','Piąty');


create table Lekarze(
Id int primary key,
Imie varchar(25),
Nazwisko varchar(25)
)

Insert into Lekarze values 
(1,'Jacek','Paździoch'),
(2,'Alona','Nowak'),
(3,'Helga','Kowalska'),
(4,'Marcin','Krzynówek'),
(5,'Jadwiga','Kiepska');


create table Specjalizacje(
Id int primary key,
Nazwa varchar(25)
)

Insert into dbo.Specjalizacje values 
(1,'Onkolog'),
(2,'Pediatra'), 
(3,'Chirurg'),
(4,'Okulista'),
(5,'Neurolog');

create table Kwalifikacje (
IdLekarza int foreign key references Lekarze(Id),
IdSpecjalizacji int foreign key references Specjalizacje(Id),
OdKiedy Date, 
constraint PK_Kwalifikacje primary key clustered (IDlekarza, IdSpecjalizacji)
)

insert into Kwalifikacje values
(1,1,'05-01-2016'),
(2,2,'01-02-2000'),
(3,3,'01-02-1995'),
(4,4,'01-02-2001'),
(5,5,'01-02-2002');


create table Gabinety(
Id int primary key,
Nazwa varchar(25)
)

declare @auto int
set @auto=1
while @auto < 51 
begin 
insert into Gabinety values
(@auto,'Socjal')
set @auto=@auto+1
end



create table Terminy(
Id int primary key,
IdGabinetu int foreign key references Gabinety(Id),
IdLekarza int foreign key references Lekarze(Id),
OdGodziny Time,
DoGodziny Time,
Dzien Date)

insert into Terminy values
(1,1,1,'10:00:00','12:00:00','2016-11-21'),
(2,2,2,'12:00:00','14:00:00','2016-11-22'),
(3,3,3,'15:00:00','16:00:00','2016-11-23'),
(4,4,4,'10:00:00','13:00:00','2016-11-24'),
(5,5,5,'09:00:00','11:00:00','2016-11-25'),
(6,6,1,'11:00:00','13:00:00','2016-11-28');

create table Wizyty(
Id int primary key,
IdPacjenta int foreign key references Pacjenci(Id),
IdTerminu int foreign key references Terminy(Id),
Godzina  Time
)

insert into Wizyty values
(1,1,1,'10:00:00'),
(2,2,2,'12:00:00'),
(3,3,3,'15:00:00'),
(4,4,4,'10:00:00'),
(5,5,5,'09:00:00'),
(6,2,6,'11:00:00'),
(7,1,6,'11:20:00');

create table Stany(
Id int primary key,
IdWizyty int foreign key references Wizyty(Id),
Stan char check (Stan in ('n','o','z')), -- n - planowana, o - obsługiwana, z - zakończona 
DzienZmiany Date,
CzasZmiany Time)

insert into Stany values 
(1,1,'n','2016-11-21','14:00:00'),
(2,2,'o','2016-11-22','11:00:00'),
(3,3,'z','2016-11-23','10:00:00'),
(4,4,'n','2016-11-24','10:00:00'),
(5,5,'o','2016-11-25','11:00:00');

create table Karta(
Id int primary key,
IdPacjenta int foreign key references Pacjenci(Id),
IdLekarza int foreign key references Lekarze(Id),
IdWizyty int foreign key references Wizyty(Id),
Opis varchar(500)
)

insert into Karta values
(1,1,1,1,'Przeziębienie'),
(2,2,2,2,'Wysoka temperatura'),
(3,3,3,3,'Wysokie ciśnienie'),
(4,4,4,4,'Objawy zapalenia płuc'),
(5,5,5,5,'Niestrawność');

 


CREATE TRIGGER dbo.LAB04
on dbo.Wizyty
FOR
INSERT
as
declare @termin numeric(2)
declare @id numeric(2)
declare @pacjent numeric(2)
declare @czas time

select @termin = IdTerminu from inserted
select @id = Id from inserted
select @pacjent =IdPacjenta from inserted
select @czas = Godzina from inserted

select * from dbo.Wizyty where IdTerminu=@termin

IF (select count(IdTerminu) from dbo.Wizyty where @termin>4) = 0
	BEGIN
		-- tutaj nie wiem jak zrobić, żeby tworzyło tabele i wyświetlało w niej to co ma robić trigger
	END

0

Utwórz NORMALNIE sobie tabelę np. Komunikaty i w trigerze wypełniaj ją.

0
IF (SELECT COUNT(IdTerminu) FROM dbo.Wizyty WHERE @termin>4) = 0

Ten warunek w połączeniu, że zmienna "termin" to IdTerminu FROM inserted (a inserted to odpowiednik Wizyty bo na niej jest trigger) sprawdza:
PODAJ Liczbę(idTerminu) Z TABELI Wizyty GDZIE "aktualnie wstawiana wartość pola IdTerminu">4
Chyba jednak NIE TO chciałeś policzyć.
Raczej chciałeś policzyć:
PODAJ Liczbę(idTerminu) Z TABELI Wizyty POLACZONEJ Z TABELĄ Terminy GDZIE Terminy.IdLekarza="id lekarza z aktualnie wstawianego terminu" Idata="ten sam dzien co aktualnie wstawiany"
I tę obliczoną liczbę porównujesz do limitu

0

nadal nie działa mi trigger, bo nie drukuje tego napisu "elo", więc nawet na razie nie bawię się z tworzeniem tabeli

 CREATE TRIGGER qwer
on dbo.Wizyty
FOR
INSERT
as
declare @termin numeric(2)
declare @id numeric(2)
declare @pacjent numeric(2)
declare @czas time
declare @data date

select @termin = IdTerminu from inserted
select @id = Id from inserted
select @pacjent =IdPacjenta from inserted
select @czas = Godzina from inserted

select * from dbo.Wizyty where IdTerminu=@termin


IF (select count(Wizyty.Id) from Wizyty join Terminy on Wizyty.IdTerminu=Terminy.Id where Terminy.Id=@termin) > 4
	BEGIN
	print 'elo'
		-- tutaj nie wiem jak zrobić, żeby tworzyło tabele i wyświetlało w niej to co ma robić trigger
	END

0

może być tak ?

 CREATE TABLE LOGI (wpis nvarchar(max))

CREATE TRIGGER wpisy
on dbo.Wizyty
FOR
INSERT
as
declare @termin numeric(2)
declare @id numeric(2)
declare @pacjent numeric(2)
declare @czas time
declare @data date

select @termin = IdTerminu from inserted
select @id = Id from inserted
select @pacjent =IdPacjenta from inserted
select @czas = Godzina from inserted

--select * from Wizyty where IdTerminu=@termin
declare @x int
declare @y date
set @x=(select TOP 1 IdLekarza from Terminy join Wizyty on Terminy.Id = Wizyty.IdTerminu where Wizyty.IdTerminu=@termin)	
set @y=(select TOP 1 Dzien from Terminy join Wizyty on Terminy.Id = Wizyty.IdTerminu where Wizyty.IdTerminu=@termin)



IF (select count(Wizyty.IdTerminu) from Wizyty join Terminy on Wizyty.IdTerminu=Terminy.Id where Terminy.Id=@termin) > 4
	BEGIN
	
	insert into LOGI values (CONCAT('Lekarz o numerze ID: ',@x,' przyjął w dniu: ',@y , ' więcej niż 4 osoby.') )

	END
1

@stonka95: ja zakładam że tabela logi powinna mieć aktualne informacje o lekarzach którzy przyjmują więcej niż 4 pacjentów w danym dniu, więc załóżmy taką:

create table dbo.logi (
	idLekarza int
	, dzien date
	,ilosc int
)

Nie wiem czy dobrze myślę, ale dla każdego lekarza per dzień powinien być jeden wpis lub 0, dlatego należy sprawdzić czy dodawany lekarz nie ma już wpisu...

Uwaga! Optymistycznie założyłeś, że w tabeli inserted będziesz miał jeden rekord, co w przypadku triggerów nie jest najlepszym tokiem myślenia. Dlatego zapomnij o zmiennych, musisz operować na zbiorach, bo spodziewasz się kilku lekarzy i to moze nawet z różnymi datami.

Jako, ze trzeba sprawdzić czy nie ma już wpisów w tabeli, ja bym poszedł drogą usuń dodane wpisy dla lekarzy i dni w inserted w tabeli logi, dodaj nowe wpisy dla >4.

CREATE TRIGGER dbo.lab06 
   ON dbo.wizyty 
   AFTER INSERT
AS 
BEGIN
	SET NOCOUNT ON;
	--USUN POLICZONE
	DELETE L
	FROM
		LOGI L
		INNER JOIN (select 
						IDLEKARZA
						, DZIEN 
					from 
						INSERTED I
						INNER JOIN TERMINY T ON I.IDTERMINU =T.ID) W ON L.IDLEKARZA=W.IDLEKARZA AND W.DZIEN=L.DZIEN
    --DODAJ WPIS W TABELI LOGI
	INSERT INTO LOGI
	SELECT
		C.IDLEKARZA
		,C.DZIEN
		,COUNT(*)
	FROM
		(select 
			IDLEKARZA
			, DZIEN 
		from 
			wizyty W
			INNER JOIN TERMINY T ON W.IDTERMINU =T.ID) C
		INNER JOIN (select DISTINCT 
						IDLEKARZA
						, DZIEN 
					from 
						INSERTED I
						INNER JOIN TERMINY T ON I.IDTERMINU =T.ID) W ON C.IDLEKARZA=W.IDLEKARZA AND W.DZIEN=C.DZIEN
	GROUP BY
		C.IDLEKARZA
		,C.DZIEN
	HAVING
		COUNT(*)>4

END
GO

Jak sprawdzenie nie jest wymagane wystarczy usunąć delete z triggera

1 użytkowników online, w tym zalogowanych: 0, gości: 1