我在尝试让我的存储过程使用时遗漏了一些东西EXECUTE AS。存储过程正在从中读取数据source_db、聚合数据并将结果存储在 中target_db。
sp 本身在target_db. 我有一个专用的登录名并将它映射到用户source_db和target_dbsp 的所有者(所以有一个用户app_agent在source_db和target_db登录app_agent)。
如果我以 身份登录app_agent并执行
EXEC target_db.app_agent_schema.import_data
Run Code Online (Sandbox Code Playgroud)
一切正常。但如果我改变
ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`)
Run Code Online (Sandbox Code Playgroud)
并尝试执行它,它抛出
服务器主体“app_agent”无法在当前安全上下文下访问数据库“source_db”。
我正在使用 SQL Server 2008。
有人能指出我的错误吗?
谢谢
更新
经过一些研究,我发现ALTER DATABASE target_db SET TRUSTWORTHY ON解决了问题,但这对我来说似乎不是正确的解决方案......
快速简单的过滤器问题。
输出会有什么不同,或者将过滤条件从 WHERE 子句移到 Join 条件中会产生什么影响。
例如:
Select a1.Name, a2.State
from student a1
left join location a2 on a1.name_id = a2.name_id
where a1.name LIKE 'A%'
and a2.state = 'New York';
Run Code Online (Sandbox Code Playgroud)
对此:
Select a1.Name, a2.State
from student a1
left join location a2 on (a1.name_id = a2.name_id) and a2.state = 'New York'
where a1.name LIKE 'A%';
Run Code Online (Sandbox Code Playgroud)
谢谢大家。
以下代码:
create or replace type sqlids_t is table of sys.v_$sql.sql_id%type;
Run Code Online (Sandbox Code Playgroud)
...给我...
Error(2,31): PLS-00329: schema-level type has illegal reference to SYS.V_$SQL
Run Code Online (Sandbox Code Playgroud)
我在创建%object或%row类型时遇到相同的错误。
有什么办法可以在我的类型定义中使用 sys 类型吗?我知道我可以使用底层的VARCHAR2(13),但如果可能的话我想避免它。
碰巧我不得不同时使用 SQL Server 和 Oracle 很长一段时间(幸好不是同时使用)。
仍然让我困惑的是将表存储为平衡树的方法。在类似 Oracle 的 RDMS 堆中是默认的,在 SQL Server(和许多其他)中,相反(集群,IOT)是真实的。每种方法的专家都声称他们的方法是唯一“正确”的,并支持通过大量测试/演示选择的观点。但是,在我看来,他们证明的唯一一点是“非默认”方法的实施很差,并且不应该用于大多数情况......
我很确定这两种方法都足够好(只是因为它们仍然存在于市场上并且表现出相当的性能)并且下面有一些数学运算,但是我没有找到任何好的参考。
我意识到这个话题可能太宽泛而无法回答,非常欢迎好的链接,但我真的很想知道为什么两种看似有争议的方法都证明它们都是有效的。
例如,说我有类似的东西
CREATE TABLE COMPANY(id int not null primary key, ...);
CREATE TABLE DEPARTMENT(id int not null primary key, company_id int not null,
CONSTRAINT FK_DEP_COMPANY_ID FOREIGN KEY(company_id) REFERENCES COMPANY(id),...);
CREATE TABLE EMPLOYEE(id int not null primary key, department_id int not null,
username varchar(30) NOT NULL, ...,
CONSTRAINT FK_EMPLOYEE_DEP_ID FOREIGN KEY(department_id) REFERENCES DEPARTMENT(id));
Run Code Online (Sandbox Code Playgroud)
我必须EMPLOYEE.username在一家公司内实现唯一性。
我看到 2 种方式。
1.AFTER在EMPLOYEE表上使用语句级触发器(类似于http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936 , case1)
2. 只是添加company_id到EMPLOYEE
它们对我来说都不理想,我想知道在这种情况下实现唯一性的正确方法是什么。
谢谢。
我试图了解 Oracle 如何确定索引是否可用于约束。例如,以下工作:
create table temp11
(id int not null,
val varchar2(10),
CONSTRAINT PK_temp11 primary key (id) using index
(create index IDX_temp11 ON temp11(id,val))
);
--Also, I can re-use the same index for another unique constraint :
ALTER TABLE temp11 ADD CONSTRAINT UQ_temp11 UNIQUE(id,val) using index IDX_temp11;
Run Code Online (Sandbox Code Playgroud)
但是,如果我更改索引定义并使其唯一,则会出现错误
ORA-14196: 不能使用指定的索引来强制执行约束。
create table temp11
(id int not null,
val varchar2(10),
CONSTRAINT PK_temp11 primary key (id) using index
(create UNIQUE index IDXU_temp11 ON temp11(id,val))
); -- ORA-14196
Run Code Online (Sandbox Code Playgroud)
** 制作 valnot null …
我可以在存储过程或函数的主体中显式限定变量:
create or replace
PROCEDURE ptest AS
int_val INT;
BEGIN
ptest.int_val:=0;
END;
/
Run Code Online (Sandbox Code Playgroud)
如何做同样的内部触发器?
create table temp1(id int not null);
create or replace trigger trg_before_insert_temp1 before insert on temp1 for each row
declare int_val int;
begin
trg_before_insert_temp1.int_val := 0; -- PLS-00201, identifier must be declared
end trg_before_insert_temp1;
/
Run Code Online (Sandbox Code Playgroud) 假设我有下表:
CREATE TABLE test(test_id int not null identity primary key,
field1 int not null,
field2 int
);
CREATE INDEX IDX_test_field1 ON test(field1);
CREATE INDEX IDX_test_field2 ON test(field2);
Run Code Online (Sandbox Code Playgroud)
现在ALTER TABLE test ALTER COLUMN field1 int工作,并field1允许null.
尽管如此,我无法改变,ALTER TABLE test ALTER COLUMN field2 int not null因为
ALTER TABLE ALTER COLUMN field2 失败,因为一个或多个对象访问此列。
此外,我无法改field1回not null.
但是,我可以根据需要多次添加然后删除检查约束:
ALTER TABLE test ADD CONSTRAINT CHK_NN_field2 CHECK (field2 IS NOT NULL);
DROP CONSTRAINT CHK_NN_field2` without any …Run Code Online (Sandbox Code Playgroud) 假设我有以下程序
CREATE PROCEDURE foo (table1_id IN TABLE1.table1_id%type,
table1_val IN TABLE1.table1_value%type)
AS
SQL_UPDATE VARCHAR2(500) := 'UPDATE TABLE1 SET table1_value =:1 WHERE table1_id = :2';
BEGIN
--.....
--1 :
EXECUTE IMMEDIATE SQL_UPDATE USING foo.table1_val, foo.table1_id;
--2 :
UPDATE TABLE1 SET table1_value = foo.table1_val WHERE table1_id = foo.table1_id;
END;
Run Code Online (Sandbox Code Playgroud)
除了样式/可读性之外,在这种情况下(我的意思是绝对可以避免的情况)使用动态查询 (1) 与 (2) 相比是否有任何性能损失?
谢谢你。
oracle ×4
constraint ×1
dynamic-sql ×1
join ×1
oracle-10g ×1
plsql ×1
security ×1
sql-server ×1
trigger ×1