【发布时间】:2013-12-22 21:38:30
【问题描述】:
我有一个包含一些数据的单独表,我想在每次在该表中插入新行时创建一个新角色。
我创建了以下触发器:
create or replace
TRIGGER TestTrigger
BEFORE INSERT ON TestTable
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW BEGIN
create role :New.RoleName;
END;
但触发器无法编译。 我有错误:PLS-00103:PLS-00103:在预期以下情况之一时遇到符号“CREATE”:(begin case declare exit for goto if loop mod null pragma raise return select update while with
这可能吗?
【问题讨论】:
-
我怀疑您不能以这种方式在触发器中使用 DDL。您可以尝试使用 Execute Immediate 来执行您的
CREATE,但我不知道是否可以像这样创建角色。 -
您可以使用
execute immediate创建角色;但不在触发器内,因为您不能在触发器内提交,而 DDL 会进行隐式提交。您可以通过使其自主或提交工作来解决这个问题,但这有点令人费解。似乎是一个奇怪的要求。如果您必须从您的应用程序创建角色,为什么不仅创建一个角色 - 在您的表中复制它会增加什么? -
我复制它们的原因是,对于每个角色,我都需要一些额外的信息:描述、创建日期、ID 等。因为我无法将这些列添加到“默认”角色表中在 Oracle 中,我创建了一个单独的表来处理附加信息。但是,我仍然需要关心我的表角色和 oracle 角色之间的一致性。
-
嗯,即使您可以从触发器中执行此操作,我也宁愿创建一个作业来解析表并创建角色...出于安全目的。