Vinnaren i pepparkakshustävlingen!
2020-05-25, 17:24
  #1
Medlem
Jag vill skapa en trigger som sparkar igång om user knackar in ett lösen mindre än 6 tecken.
Vad gör jag för fel?

Kod:
drop table katalog;

create sequence my_seq 
start with 1
increment by 1


create table katalog(
fnamn varchar2(20),
enamn varchar2(20),
studId number(6),
regDatum date,
lösenord varchar(20)
); 

alter table katalog
add constraint katalog_studId_pk primary key 
(studId); 

create or replace trigger biufer_passwd
before insert 
or update 
on katalog
for each row
when 
(new.lösenord 6)
begin 
raise_application_error
('lösenord error');  
end

insert into katalog(fnamn,enamn,studId,regDatum,lösenord)
values('Jan','Anderson',my_seq.nextval,sysdate,'funkis'); 

insert into katalog(fnamn,enamn,studId,regdatum,lösenord)
values('Felix','Svensson',my_seq.nextval,sysdate,'plasthink'); 

insert into katalog(fnamn,enamn,studId,regDatum,lösenord)
values('Hannes','Persson',my_seq.nextval,sysdate,'marshall'); 

select 
from katalog

EDIT: tydligen ska varje triggerblock avslutas med '/'.

Nu till nästa fundering: hur skriver jag en fungerande raise_application_error?
Tanken är att programmet ska tvärbromsa om triggerblocket blir TRUE?
Skrivet jag en vanlig utskrift funkar ovanstående kod men inte genom raise_application_error?
Tar den flera parametrar?
__________________
Senast redigerad av bosscs2 2020-05-25 kl. 17:35.
Citera
2020-05-25, 21:30
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av bosscs2
Jag vill skapa en trigger som sparkar igång om user knackar in ett lösen mindre än 6 tecken.
Vad gör jag för fel?

Kod:
drop table katalog;

create sequence my_seq 
start with 1
increment by 1


create table katalog(
fnamn varchar2(20),
enamn varchar2(20),
studId number(6),
regDatum date,
lösenord varchar(20)
); 

alter table katalog
add constraint katalog_studId_pk primary key 
(studId); 

create or replace trigger biufer_passwd
before insert 
or update 
on katalog
for each row
when 
(new.lösenord 6)
begin 
raise_application_error
('lösenord error');  
end

insert into katalog(fnamn,enamn,studId,regDatum,lösenord)
values('Jan','Anderson',my_seq.nextval,sysdate,'funkis'); 

insert into katalog(fnamn,enamn,studId,regdatum,lösenord)
values('Felix','Svensson',my_seq.nextval,sysdate,'plasthink'); 

insert into katalog(fnamn,enamn,studId,regDatum,lösenord)
values('Hannes','Persson',my_seq.nextval,sysdate,'marshall'); 

select 
from katalog

EDIT: tydligen ska varje triggerblock avslutas med '/'.

Nu till nästa fundering: hur skriver jag en fungerande raise_application_error?
Tanken är att programmet ska tvärbromsa om triggerblocket blir TRUE?
Skrivet jag en vanlig utskrift funkar ovanstående kod men inte genom raise_application_error?
Tar den flera parametrar?
Kodar inte mot oracle så jag skjuter vilt här.

Kollar man på exemplet på sidan https://www.oracletutorial.com/plsql...ication_error/ ser det ut som om det saknas saker i din trigger för att det ska funka. Vad händer om du ändrar den lite?

Kod:
create or replace trigger biufer_passwd
before insert or update 
on katalog
DECLARE
    passwd_too_short EXCEPTION;
    PRAGMA exception_init(passwd_too_short, -20111);

for each row
when (new.lösenord < 6)
begin 
raise_application_error(-20111,'lösenord error');  
end; 

Ingen aning om det funkar som sagt, men kolla på exemplet så kanske du kan fixa de buggar som jag säkerligen lyckats införa nu
Citera
2020-05-26, 11:24
  #3
Medlem
miikoss avatar
Något sådant här kanske?

Kod:
create or replace trigger biufer_passwd
before insert or update 
on katalog

declare
short_passw exception;

begin
for each row
when (new.lösenord < 6)
then raise short_passw;

exception
when short_passw then
raise_application_error(-20001,'lösenord error');  

end; 
/
Citera
2020-05-27, 20:06
  #4
Medlem
Citat:
Ursprungligen postat av miikos
Något sådant här kanske?

Kod:
create or replace trigger biufer_passwd
before insert or update 
on katalog

declare
short_passw exception;

begin
for each row
when (new.lösenord < 6)
then raise short_passw;

exception
when short_passw then
raise_application_error(-20001,'lösenord error');  

end; 
/

Funkar inte heller,
jag ser inget fel?
Citera
2020-05-28, 13:52
  #5
Medlem
miikoss avatar
Prova med att förtydliga att du vill jämföra längden utav textsträngen. Det verkar som deafult är binär jämförelse utav ascii-värde eller liknande.

https://docs.oracle.com/database/121...htm#SQLRF51037

Kod:
create or replace trigger biufer_passwd
before insert 
or update
 
on katalog
for each row

when 
(LENGTH(new.lösenord) < 6)

begin 
raise_application_error
(-20001,'lösenord error');  
end;

__________________
Senast redigerad av miikos 2020-05-28 kl. 14:23.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback