Sous le nom d'utilisateur' MY_ADMIN ', j'ai créé avec succès une table appelée' NOTIFICATIONS 'et une vue appelée' V_NOTIFICATIONS '. Dans la vue 'V_NOTIFICATIONS', j'ai réussi à créer un trigger et un package qui prend ce que l'utilisateur tente d'insérer dans la vue et l'insère dans la table. Le déclencheur et le package 'V_NOTIFICATIONS' exécutent également les fonctions de mise à jour et de suppression sur la table lorsque l'utilisateur tente d'exécuter les fonctions de mise à jour et de suppression sur la vue.Erreur 'ORA-01031: privilèges insuffisants reçus lors de l'insertion dans une vue
Je l'ai fait avec de nombreuses vues dans le projet sur lequel je travaille actuellement, car de nombreuses vues se trouvent au-dessus de nombreuses tables différentes, mais lorsque j'essaie d'insérer un enregistrement dans cette vue, je reçois un ORA-01031: Erreur de privilèges insuffisante.
Je peux insérer directement dans la table en utilisant le même code qui est dans le paquet, mais pas dans la vue. Toute aide à ce sujet serait grandement appréciée. Voici le code demandé:
VIEW: (Lorsque l'Union ci-dessous est commenté, le paquet fonctionne comme prévu)
CREATE OR REPLACE FORCE VIEW "MY_ADMIN"."V_NOTIFICATIONS" AS
SELECT N_ID,
NOTIFICATION_TYPE,
CASE WHEN NOTIFICATION_DESC = 'C' THEN 'Copy' ELSE 'Send to' END NOTIFICATION_DESC,
CASE WHEN CONTACT_TYPE = 'D' THEN 'Department' ELSE 'Contact' END CONTACT_TYPE,
A.AU_USER_ID,
A.CONTACT_NAME,
D.DEPARTMENT_ID,
D.DEPT_DESC
FROM NOTIFICATIONS AN,
(SELECT A1.AU_USER_ID,
AU.FIRST_NAME || ' ' || AU.LAST_NAME CONTACT_NAME
FROM APP_USERS_CONTACT_INFO A1,
APPLICATION_USERS AU
WHERE A1.AU_USER_ID = AU.USER_ID
/*UNION
SELECT 0,
NULL
FROM DUAL*/) A,
(SELECT DEPARTMENT_ID,
DESCRIPTION DEPT_DESC
FROM DEPARTMENTS
UNION
SELECT 0 DEPARTMENT_ID,
NULL DEPT_DESC
FROM DUAL) D
WHERE NVL(AN.AU_USER_ID,0) = A.AU_USER_ID
AND NVL(AN.D_DEPARTMENT_ID,0) = D.DEPARTMENT_ID;
PAQUET:
CREATE OR REPLACE PACKAGE NOTIFICATIONS_PKG AS
PROCEDURE INSERT_NOTIFICATION(P_N_ROW V_NOTIFICATIONS%ROWTYPE);
END NOTIFICATIONS_PKG;
/
CREATE OR REPLACE PACKAGE BODY NOTIFICATIONS_PKG AS
PROCEDURE INSERT_NOTIFICATION(P_N_ROW V_NOTIFICATIONS%ROWTYPE) IS
L_NOTIFICATION_DESC VARCHAR2(1);
L_CONTACT_TYPE VARCHAR2(1);
BEGIN
CASE P_N_ROW.NOTIFICATION_DESC
WHEN 'Copy' THEN
L_NOTIFICATION_DESC := 'C';
ELSE
L_NOTIFICATION_DESC := 'S';
END CASE;
CASE P_N_ROW.CONTACT_TYPE
WHEN 'Department' THEN
L_CONTACT_TYPE := 'D';
ELSE
L_CONTACT_TYPE := 'C';
END CASE;
INSERT INTO NOTIFICATIONS VALUES (
P_N_ROW.N_ID,
P_N_ROW.NOTIFICATION_TYPE,
L_NOTIFICATION_DESC,
L_CONTACT_TYPE,
NVL(P_N_ROW.AU_USER_ID, 0),
NVL(P_N_ROW.DEPARTMENT_ID, 0),
APP_GLOBAL_PKG.GET_AUDIT);
END INSERT_AGREEMENT_NOTIFICATION;
END AGREEMENT_NOTIFICATIONS_PKG;
Le déclencheur est configuré juste passez des informations à ce package pour insérer la ligne. Lors de la tentative d'exécution de la ligne de code suivante, je reçois l'erreur ORA-01031:
INSERT INTO V_AGREEMENT_NOTIFICATIONS VALUES (5781, 'Collateral Request', 'Send to', 'Contact', 797, '797T', 0, null);
est-il possible d'insérer des données dans une vue? Ne le pense pas. – Tom
vous pouvez, mais seulement sous certaines conditions (par exemple, la vue n'est pas une jointure un-à-plusieurs, ou il existe un au lieu de déclencher) – MJB
Cela me semble trop compliqué. Savez-vous que les procédures stockées encapsulent l'accès, de sorte que vous pouvez autoriser l'exécution sur les procédures d'insertion/mise à jour qui effectuent les actions sans accorder l'accès à la table? –