-
2020-12-29 06:41:56
在2.x的版本中,在manifest中配得sd卡获得写的权而在4.0开发的源码当中,由于有了内外置sd卡的区分,android.permission.WRITE_EXTERNAL_STORAGE的权限用来设置了内置sd卡的写权限,如果在manifest中只是配置了这个权限,那个应用只能在内置sd卡中进行写操作,还是无法在外置sd卡中进行写操作。需要写外置sd卡的话,需要配置另一个权限android.permission.WRITE_MEDIA_STORAGE,这样就可以在外置sd卡中进行写入操作了。这两个权限都被定义在android源码目录\frameworks\base\data\etc\platform.xml中:<permissionname="android.permission.WRITE_EXTERNAL_STORAGE"><groupgid="sdcard_rw"/></permission><permissionname="android.permission.WRITE_MEDIA_STORAGE"><groupgid="media_rw"/></permission>使用到的类主要是framework/base/core/java/android/os/storage/StorageVolume.java及相同目录下的StorageManager.java文件。StorageManager类可以获得所有的存储媒体列表,及StorageVolume类型的数组,从而可以获得对应存储是否可读写一类的信息。如果是安卓6.0的外置SD卡的话可以先打开设置,然后应用程序——应用程序管理器,再打开某个软件——存储——选择已使用的存储空间,然后点更改,选择SD卡,这样就可以了。
阅读全文 >
更多相关内容 -
如何实现只授予用户查看存储过程定义的权限
2020-12-16 08:00:56有个网友问我,如何授予某个用户只能查看某些存储过程的定义权限,而不能让用户去修改、执行存储过程。看似简单的问题,却因为从没有碰到这样的需求。花了点时间才梳理、总结清楚。 关于ORACLE账号的权限问题,一般... -
oracle存储过程的定义者权限与调用者权限
2020-02-17 20:30:27oracle存储过程的定义者权限与调用者权限 当某个用户定义的存储过程由另一个用户调用时,需要指定存储过程的Definer(定义者权限 )与Invoker(调用者权限)。 一、存储过程的定义者权限 存储过程默认为该权限,也...oracle存储过程的定义者权限与调用者权限
当某个用户定义的存储过程由另一个用户调用时,需要指定存储过程的Definer(定义者权限 )与Invoker(调用者权限)。
一、存储过程的定义者权限
存储过程默认为该权限,也可以在定义存储过程的is|as之前添加authid definer参数,格式如下:
create [or replace] procedure 名称 [(参数1 in | out | in out 类型, 参数2 in | out | in out 类型, ...)] authid definer is|as --变量声明区间 begin --业务逻辑区间 exception --异常处理 end; /
说明:如果一个存储过程的执行权限为定义者权限,则当另一个用户调用该存储过程时,和存储过程的所有者调用该存储过程是一样的(就相当于是存储过程的所有者调用了该存储过程)。
测试效果:
1、在scott用户下创建一张表t1,并输入数据
create table t1( id number(6) primary key, name varchar2(20), age number(2), phone varchar2(20) ); SQL> select * from t1; ID NAME AGE PHONE ---------- -------------------- ---------- -------------------- 101 JACK 25 13603735588 102 JERRY 21 13503736645 103 TOM 32 13037350422 104 ROSE 28 13903732266 105 MARK 19 15903736633 106 JIMMI 20 15037355066 6 rows selected.
2、在scott用户下创建一个存储过程,使用默认的definer权限,查看某个用户的姓名和电话
SQL> create or replace procedure sp_get_t1 (v_id number, v_name out varchar2, v_phone out varchar2) authid definer is begin select name,phone into v_name,v_phone from t1 where id=v_id; exception when no_data_found then dbms_output.put_line('没有该用户信息!'); end; 15 / Procedure created.
3、查看该存储过程的信息
该存储过程的执行权限为DEFINER(定义者权限)。
SQL> select object_name,procedure_name,authid from user_procedures where object_name='SP_GET_T1'; OBJECT_NAME PROCEDURE_NAME AUTHID ------------------------------ -------------------- ------------ SP_GET_T1 DEFINER
4、调用该存储过程
SQL> declare v_id t1.id%type; v_name t1.name%type; v_phone t1.phone%type; begin v_id:=&t1_id; sp_get_t1(v_id,v_name,v_phone); dbms_output.put_line( v_id||'用户的姓名:'||v_name|| ',电话:'||v_phone); end; 12 / Enter value for t1_id: 103 old 6: v_id:=&t1_id; new 6: v_id:=103; 103用户的姓名:TOM,电话:13037350422 PL/SQL procedure successfully completed.
5、创建一个用户JACK,在该用户下创建表t1,并输入数据
(1)创建用户JACK并授权
SQL> show user; USER is "SYS" SQL> create user JACK identified by JACK; User created. Elapsed: 00:00:00.09 Elapsed: 00:00:00.03 SQL> grant resource,connect to JACK; Grant succeeded.
(2)以JACK用户身份登录,创建表t1并输入数据
SQL> show user; USER is "JACK" SQL> create table t1( id number(6) primary key, name varchar2(20), age number(2), phone varchar2(20) 6 ); Table created. SQL> select * from t1; ID NAME AGE PHONE ---------- -------------------- ---------- -------------------- 101 张飞 25 100801 102 赵云 21 200258 103 关羽 32 400125
6、以scott用户身份登录,把存储过程sp_get_t1的执行权限授予用户JACK
SQL> show user; USER is "SCOTT" SQL> grant execute on sp_get_t1 to JACK; Grant succeeded.
7、以用户JACK身份登录,调用存储过程sp_get_t1并查看结果
SQL> show user; USER is "JACK" SQL> declare v_id t1.id%type; v_name t1.name%type; v_phone t1.phone%type; begin v_id:=&t1_id; sp_get_t1(v_id,v_name,v_phone); dbms_output.put_line( v_id||'用户的姓名:'||v_name|| ',电话:'||v_phone); end; 11 12 / Enter value for t1_id: 103 old 6: v_id:=&t1_id; new 6: v_id:=103; 103用户的姓名:TOM,电话:13037350422 PL/SQL procedure successfully completed.
此时发现,用户JACK调用存储过程sp_get_t1的输出结果和存储过程的定义者scott调用该存储过程的结果是完全相同的。
二、存储过程的调用者权限
可以在定义存储过程的is|as之前添加authid current_user参数,格式如下:
create [or replace] procedure 名称 [(参数1 in | out | in out 类型, 参数2 in | out | in out 类型, ...)] authid current_user is|as --变量声明区间 begin --业务逻辑区间 exception --异常处理 end; /
说明:如果一个存储过程的执行权限为调用者权限,则当另一个用户调用该存储过程时,就相当于该用户自己创建了一个完全相同的存储过程。
测试效果:
1、在scott用户下创建一个存储过程,使用current_user权限,查看某个用户的姓名和电话
SQL> show user; USER is "SCOTT" SQL> create or replace procedure sp_get_t1_02 (v_id number, v_name out varchar2, v_phone out varchar2) authid current_user is begin select name,phone into v_name,v_phone from t1 where id=v_id; exception when no_data_found then dbms_output.put_line('没有该用户信息!'); end; 15 / Procedure created.
2、查看该存储过程的信息
该存储过程的执行权限为CURRENT_USER(调用者权限)。
SQL> select object_name,procedure_name,authid from user_procedures where object_name='SP_GET_T1_02'; OBJECT_NAME PROCEDURE_NAME AUTHID ------------------------------ -------------------- ------------ SP_GET_T1_02 CURRENT_USER
3、scott用户调用该存储过程
SQL> show user; USER is "SCOTT" SQL> declare v_id t1.id%type; v_name t1.name%type; v_phone t1.phone%type; begin v_id:=&t1_id; sp_get_t1_02(v_id,v_name,v_phone); dbms_output.put_line( v_id||'用户的姓名:'||v_name|| ',电话:'||v_phone); end; 12 / Enter value for t1_id: 103 old 6: v_id:=&t1_id; new 6: v_id:=103; 103用户的姓名:TOM,电话:13037350422 PL/SQL procedure successfully completed.
4、以scott用户身份登录,把存储过程sp_get_t1_02的执行权限授予用户JACK
SQL> show user; USER is "SCOTT" SQL> SQL> grant execute on sp_get_t1_02 to JACK; Grant succeeded.
5、以用户JACK身份登录,调用存储过程sp_get_t1_02并查看结果
SQL> show user; USER is "JACK" SQL> declare v_id t1.id%type; v_name t1.name%type; v_phone t1.phone%type; begin v_id:=&t1_id; scott.sp_get_t1_02(v_id,v_name,v_phone); dbms_output.put_line( v_id||'用户的姓名:'||v_name|| ',电话:'||v_phone); end; 12 / Enter value for t1_id: 103 old 6: v_id:=&t1_id; new 6: v_id:=103; 103用户的姓名:关羽,电话:400125 PL/SQL procedure successfully completed.
此时发现,用户JACK调用存储过程sp_get_t1_02,就像自己编写了一个存储过程,调用的是自己的t1表。
四、查看存储过程信息
1、查看当前用户所定义的所有存储过程的名称
SQL> select object_name,procedure_name,object_type,deterministic,authid from user_procedures; OBJECT_NAME PROCEDURE_NAME OBJECT_TYPE DET AUTHID ------------------------------ -------------------- ------------------- --- ------------ SP_EMP_INSERT PROCEDURE NO DEFINER SP_SET_EMP_SAL PROCEDURE NO DEFINER SP_DISP PROCEDURE NO DEFINER SP_CIRCLE_AREA PROCEDURE NO DEFINER SP_UPDATE_EMP_SAL PROCEDURE NO DEFINER SP_GET_EMP PROCEDURE NO DEFINER SP_UPDATE_EMP_SAL_01 PROCEDURE NO DEFINER SP_INSERT_T01_FORALL PROCEDURE NO DEFINER SP_SCORE_GRADE PROCEDURE NO DEFINER SP_DELETE_T1_FORALL PROCEDURE NO DEFINER SP_INSERT_T01_FORALL02 PROCEDURE NO DEFINER SP_UPDATE_T1_FORALL PROCEDURE NO DEFINER SP_INSERT_T01 PROCEDURE NO DEFINER SP_UPDATE_EMP_BULK PROCEDURE NO DEFINER SP_UPDATE_T01_FORALL PROCEDURE NO DEFINER SP_EMP_ENAME_DEPT PROCEDURE NO DEFINER SP_EMP_DEPTNO11 PROCEDURE NO DEFINER SP_EMP_DEPTNO PROCEDURE NO DEFINER SP_FETCH_EMP PROCEDURE NO DEFINER PS_ADD PROCEDURE NO DEFINER SP_ADD PROCEDURE NO DEFINER SET_SAL PROCEDURE NO DEFINER GET_EMP PROCEDURE NO DEFINER TEST_CREATE PROCEDURE NO DEFINER UPDATE_SAL PROCEDURE NO DEFINER ADD_SAL PROCEDURE NO DEFINER 26 rows selected.
2、查看存储过程的参数信息
SQL> desc get_emp; PROCEDURE get_emp Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_EMPNO NUMBER IN V_ENAME VARCHAR2 OUT V_SAL NUMBER OUT
3、查看某个存储过程的代码
SQL> select text from user_source where name='SP_UPDATE_EMP_SAL'; TEXT -------------------------------------------------------------------------------- procedure sp_update_emp_sal as type t_table_emp is table of emp%rowtype index by binary_integer; v_table_emp t_table_emp; begin update emp set sal=sal*1.1 where deptno=10; select * bulk collect into v_table_emp from emp where deptno=10; for i in v_table_emp.first..v_table_emp.last loop dbms_output.put_line('雇员编号:'||v_table_emp(i).empno|| ', 姓名:'||v_table_emp(i).ename|| ', 工资:'||v_table_emp(i).sal); end loop; end; 14 rows selected.
五、存储过程应用举例
1、无参数存储过程
把emp表10部分所有人的工资增加10%,并且显示员工编号、姓名及工资信息。
SQL> create or replace procedure sp_update_emp_sal as type t_table_emp is table of emp%rowtype index by binary_integer; v_table_emp t_table_emp; begin update emp set sal=sal*1.1 where deptno=10; select * bulk collect into v_table_emp from emp where deptno=10; for i in v_table_emp.first..v_table_emp.last loop dbms_output.put_line('雇员编号:'||v_table_emp(i).empno|| ', 姓名:'||v_table_emp(i).ename|| ', 工资:'||v_table_emp(i).sal); end loop; end; / Procedure created.
运行存储过程,结果如下:
SQL> call sp_update_emp_sal(); 雇员编号:7934, 姓名:MILLER, 工资:1574.21 雇员编号:7782, 姓名:CLARK, 工资:2965.71 雇员编号:7839, 姓名:KING, 工资:6051.21 Call completed.
注意:无参数存储过程调用时要加一对空括号。
2、带输入参数的存储过程
对上例的存储过程进行修改,通过指定一个输入参数,用户在调用时指定某个部门,则把该部门员工的工资增加10%,并显示该部门员工的工号、姓名和工资。代码如下:
SQL> create or replace procedure sp_update_emp_sal_01 (v_deptno number) as type t_table_emp is table of emp%rowtype index by binary_integer; v_table_emp t_table_emp; begin update emp set sal=sal*1.1 where deptno=v_deptno; select * bulk collect into v_table_emp from emp where deptno=v_deptno; for i in v_table_emp.first..v_table_emp.last loop dbms_output.put_line('雇员编号:'||v_table_emp(i).empno|| ', 姓名:'||v_table_emp(i).ename|| ', 工资:'||v_table_emp(i).sal); end loop; end; / Procedure created.
调用时指定20部门作为参数,查询结果如下:
SQL> call sp_update_emp_sal_01(20); 雇员编号:7788, 姓名:SCOTT, 工资:2423.63 雇员编号:7876, 姓名:ADAMS, 工资:1334.63 雇员编号:7566, 姓名:JONES, 工资:3603.38 雇员编号:7902, 姓名:FORD, 工资:3633.63 雇员编号:7369, 姓名:SMITH, 工资:971.63 Call completed.
3、指定输出参数
输入一个圆的半径,求圆的面积,代码如下:
SQL> create or replace procedure sp_circle_area (v_radius in number,area out number) as begin area:=3.1415926*power(v_radius,2); end; 7 / Procedure created.
在代码块中调用该该存储过程,结果如下:
SQL> declare v_area number(15,8); begin sp_circle_area(4,v_area); dbms_output.put_line('圆的面积为:'||v_area); end; 7 / 圆的面积为:50.2654816 PL/SQL procedure successfully completed.
4、综合练习
为emp插入一条新记录:
(1)创建一个序列seq_emp,从9001开始编号
SQL> create sequence seq_emp start with 9001; Sequence created.
(2)创建一个存储过程sp_emp_insert
create or replace procedure sp_emp_insert (v_ename varchar2, v_job varchar2 default 'SALESMAN', v_mgr number default 7698, v_hiredate date default sysdate, v_sal number default 2000, v_comm number default 0, v_deptno number default 40) as begin insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(seq_emp.nextval, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno); end; /
执行存储过程:
SQL> call sp_emp_insert('Jerry'); Call completed. Elapsed: 00:00:00.02 SQL> call sp_emp_insert('John',v_sal=>1800); Call completed. Elapsed: 00:00:00.00 SQL> call sp_emp_insert('Merry',v_hiredate=>sysdate-10,v_sal=>2100); Call completed. Elapsed: 00:00:00.01 SQL> select * from emp where empno>9000; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ------ 9001 Jerry SALESMAN 7698 2020-02-17 01:01:22 2000 0 40 9002 John SALESMAN 7698 2020-02-17 01:02:39 1800 0 40 9003 Merry SALESMAN 7698 2020-02-07 01:03:40 2100 0 40
-
如何只授予用户查看存储过程定义的权限
2015-10-21 14:58:52一般分为两种权限:系统权限: 允许用户执行特定的数据库动作,如创建表、创建索引、创建存储过程等对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列、执行存储过程等像这种查看存储过程定义的权限为...关于ORACLE账号的权限问题,一般分为两种权限:
系统权限: 允许用户执行特定的数据库动作,如创建表、创建索引、创建存储过程等
对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列、执行存储过程等
像这种查看存储过程定义的权限为对象权限,但是我们还是首先来看看关于存储过程的系统权限吧:
PRIVILEGE NAME PROPERTY
-140 CREATE PROCEDURE 0 -141 CREATE ANY PROCEDURE 0 -142 ALTER ANY PROCEDURE 0 -143 DROP ANY PROCEDURE 0 -144 EXECUTE ANY PROCEDURE 0 -241 DEBUG ANY PROCEDURE 0
如上所示,关于存储过程的系统权限一般有六种: CREATE PROCEDURE、CREATE ANY PROCEDURE、 ALTER ANY PROCEDURE、DROP ANY PROCEDURE、 EXECUTE ANY PROCEDURE、DEBUG ANY PROCEDURE. 那么关于存储过程的对象权限又有那些呢? 如下例子所示,在用户ESCMUSER下创建存储过程PROC_TEST
CREATE OR REPLACE PROCEDURE ESCMUSER.PROC_TEST
AS
BEGIN
DBMS_OUTPUT.PUT_LINE(‘It is only test’);
END;
使用system用户创建用户TEMP,如下所示SQL> create user temp identified by temp;
User created.
SQL> grant connect,resource to temp;
Grant succeeded.
在用户ESCMUSER下将存储过程PROC_TEST的所有权限授予给用户TEMP。 那么我们发现存储过程的对象权限只有EXECUTE、DEBUG权限SQL> COL GRANTEE FOR A12;
SQL> COL TABLE_NAME FOR A30;
SQL> COL GRANTOR FOR A12;
SQL> COL PRIVILEGE FOR A8;
SQL> SELECT * FROM USER_TAB_PRIVS_MADE WHERE GRANTEE=’TEMP’;
GRANTEE TABLE_NAME GRANTOR PRIVILEGE GRA HIE
TEMP PROC_TEST ESCMUSER DEBUG NO NO
TEMP PROC_TEST ESCMUSER EXECUTE NO NO
SQL>
将存储过程PORC_TEST的权限从TEMP用户收回,然后授予用户TEMP关于存储过程PROC_TEST的DEBUG权限
SQL>REVOKE ALL ON PROC_TEST FROM TEMP;
SQL>GRANT DEBUG ON PROC_TEST TO TEMP;
那么TEMP用户此时执行存储过程报权限不足SQL> SET SERVEROUT ON;
SQL> EXEC escmuser.proc_test;
begin escmuser.proc_test; end;
ORA-06550: line 2, column 16:
PLS-00904: insufficient privilege to access object ESCMUSER.PROC_TEST
ORA-06550: line 2, column 7:
PL/SQL: Statement ignored
此时,如果修改存储过程PROC_TEST就会ORA-01031权限不足问题。但是你可以在PL/SQL Developer工具或使用下面视图查看存储过程的定义。如下所示。SELECT * FROM ALL_SOURCE WHERE NAME=’PROC_TEST’
所以,只需要授予存储过程的DEBUG权限给某个用户,就可以实现只授予用户查看存储过程定义的权限,而限制用户修改、执行存储过程。从而达到只授权用户查看存储过程定义的权限。不过这样实现,总让我感觉有点怪怪的。
原文链接:http://www.cnblogs.com/kerrycode/p/4580256.html
【编辑推荐】
Oracle数据库初学者开场篇
通过Oracle来辅助MySQL数据问题的恢复
Oracle免费的便捷Web应用开发框架二则
IOUG主席谈Oracle云服务战略和大数据用途
Oracle 数据库灾难性环境下恢复实例 -
安卓7.0文件存储权限变更
2017-09-18 15:16:49安卓7.0文件存储权限变更安卓7.0文件存储权限变更
相关网站
Setting Up File Sharing
首先,你要定义一个FileProvider在你的App的Manifest文件中,这个文件中有一个特殊的一栏就是authority,它是用于生成content URIs,下面是provider的形式<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
在这个例子中android:authorities是 FileProvider生成content URIs必备的权限属性
在这个例子中权限是com.example.myapp.fileprovider,对于我们自己的应用通常是由你的包名+字符串“fileprovider”,想查看更改关于权限值,你可以点击这里
(其中android:grantUriPermissions必须为true,android:exported必须为false)
是provider的子元素,它指向你想分享的一个XML文件,这个resource属性就是分享文件的路径和文件名,Specify Sharable Directories
一旦你添加了 FileProvider在你的app得Manifest中,你就得添加一个相应的文件夹,这个文件中中包含了你想要分享的文件,通过在你的工程res目录下创建xml文件,添加filepaths.xml文件,下面是一个样例<paths> <files-path path="images/" name="myimages" /> </paths>
标签分享了一个文件在你app的内部存储文件夹中,path属性分享了一个在files/目录下的一个images/子目录,name属性告诉 FileProvider给文件files/images添加一个路径myimages给 content URIs。
这个元素有很多子类,不同的标签分享了不同的文件,除了标签外,你也可以用标签,它是分享外置存储文件夹的, 标签用于分享内置缓存文件夹的。
下面来看看他们的类型。<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> ... </paths>
标签中必须包含一个或者多个子元素
<files-path name="name" path="path" />
代表文件在你的应用内置存储区域files/下的子目录,这种类型和
Context.getFilesDir().
所返回的路径一样。
<cache-path name="name" path="path" />
这种表示在你应用App内置存储区域下的缓存文件,它和 getCacherDir()返回的路径一样。
<external-path name="name" path="path" />
这种代表在你App的外置存储的根目录下的文件,它和Context#getExternalFilesDir(String) Context.getExternalFilesDir(null).返回的路径一样。
<external-cache-path name="name" path="path" />
这种代表在你app的外置缓存区域根目录下的文件,它和Context.getExternalCacheDir().返回的路径一样。
以上的标签都有相同的属性name和path其中name表示:一个URI路径,为了安全考虑,这个值隐藏在你要分享的子目录名字下面,这个子目录的名字就包含路径属性。
其中path表示:你要分享的子目录,当name属性是一个URI路径时,这个path的值实际上就是子目录的名字。
你必须指定一个子元素的path给每个你想分享的内容RUIs,例如
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> <files-path name="my_docs" path="docs/"/> </paths>
这些XML元素指定了两个文件夹。
Generating the Content URI for a File
给一个文件生成Content URI为了分享一个文件给任何app使用,你的App必须生成 content URI,
例如:如果你的App提供了一个文件给其他一个有com.mydomain.fileprovider的权限的应用通过FileProvider使用,为了获得URIs给文件default_image.jpg在你的内存存储子目录下的images/,你就得添加下面的代码。File imagePath = new File(Context.getFilesDir(), "images"); File newFile = new File(imagePath, "default_image.jpg"); Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
通过上面的代码可以得到这样的结果,getUriForFile() 返回的路径是:
content://com.mydomain.fileprovider/my_images/default_image.jpg。Granting Temporary Permissions to a URI
授予临时权限给URI
通过方法 Context.grantUriPermission(package, Uri, mode_flags) 的形式,添加mode_flags授予临时权限给URI,你可以设置为:FLAG_GRANT_READ_URI_PERMISSION 或者 FLAG_GRANT_WRITE_URI_PERMISSION 或者一起使用
也可以说通过revokeUriPermission() 撤销权限
然后通过Intent的setData()方法将content URI 设置进去,也可以通过 Intent.setFlags() 的方法将FLAG_GRANT_READ_URI_PERMISSION或者 FLAG_GRANT_WRITE_URI_PERMISSION,或者一起,设置为赋予权限。
最后将Intent传递给其他app,经常使用的是setResult()方法。另外,权限赋予在一个Intent中仍然有效,只要Activity栈中activity是处于激活状态的。当activity结束了,权限赋予会自动移除。
-
MySQL存储过程定义及常见函数详解
2018-07-04 11:05:06存储过程简介SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行... -
mysql存储过程中定义权限
2017-03-02 17:25:26创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来奉告mysql在执行存储过程的时候,,是以DEFINER用户的权限来执行,还是以调用者*(invoker)的权限来执行。 默认情况下,... -
Oracle数据库存储过程与权限.pdf
2020-09-21 06:52:17在执行存储过程时我们可能会遇到权限问题 定义者权限存储过程 调用者权限存储过程 在数据库中创建存储过程时定义者权限是缺省模式 当指定 AUTHID CURRENT_USER 关键字后便是调用者权限存储过程 他俩之间最根本的差异... -
Android Q分区存储权限变更及适配
2019-06-30 11:15:46分区存储 在Android Q中引入了分区储存功能,在外部存储设备中为每个应用提供了一个“隔离存储沙盒”。...Android Q 更改了应用对设备外部存储设备中的文件(如:/sdcard )的访问方式。继续使用 READ_E... -
批量修改MYSQL的存储过程或者函数定义者
2018-09-10 15:54:11批量修改数据库存储过程、函数定义者 UPDATE mysql.proc SET DEFINER=’adm@%’ WHERE db = ‘数据库名称’; 修改指定的某个函数/存储过程定义者 UPDATE mysql.proc SET DEFINER=’adm@%’ WHERE db = ... -
【Android开发点滴】解决安卓6.0以上版本不能读取外部存储权限的问题
2017-09-24 23:57:09我们都知道当应用程序需要读取手机内部数据例如图片,或者存储数据到手机上例如保存用加密的登陆密码等等,这些操作需要在AndroidManifest.xml中注册以下权限:<!--读写磁盘的权限--> <uses-permission a -
5分钟学会MySQL存储过程_1、定义及应用场景
2018-11-14 13:40:02存储过程定义及应用场景 一、什么是存储过程 顾名思义,存储过程(Stored Procedure)就是一组为了完成特定功能的SQL语句的集合,经过编译之后存储在数据库 中,用户通过指定存储过程的名字并给定其参数... -
Android开发——本地存储、用户权限获取
2020-04-29 10:58:57Android的逻辑存储结构有三种 内部存储结构 Internal Private Storage 外部私有存储结构 External Private Storage 外部公有存储结构 External Public Storage 权限内容区别如下 每次安装APP,最初开始的时候都有... -
安卓手机外置sd卡权限怎么打开
2020-12-19 20:57:31展开全部在2.x的版本中,在manifest中配置的权限e68a843231313335323631343130323136353331333365643662android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。而在4.0开发的源码当中,由于有... -
存储过程调用权限
2018-05-21 11:22:54SQL SECURITY DEFINER 创建存储过程默认调用权限以definer执行,即调用者以...存储过程以调用者的权限来执行,mysql检查调用者是否有执行存储过程定义语句的权限 ps:以上两种都需要调用者有存储过程的EXECUTE权限... -
Mysql修改存储过程和函数的定义者
2017-01-23 13:57:42MySQL中执行存储过程和函数时会检查过程的定义用户是否存在,以及是不是当前用户定义的,如果不存在,或者创建用户不对,即使当前用户有执行权限也会报错。The user specified as a definer ('otherdataonline@%') ... -
erp 数据权限定义(用友NC)
2015-12-15 18:41:47一、数据权限定义 数据权限主要分为维护权限,使用权限,特殊权限。 操作是与业务实体相关联的业务行为,分为维护类操作和使用类操作。 A. 维护类操作:对业务实体数据进行维护,改变其属性的操作,例如删除、修改... -
实战篇:Oracle分区表之在线重定义
2021-07-16 21:31:38使用在线重定义的方式进行分区表的转换,优势在于可以在线进行,流程简单,可以快速进行转换。 -
对象存储、文件存储、块存储的区别和联系
2021-10-16 19:24:081、块存储 - 典型设备:磁盘阵列,硬盘 - 主要是将裸磁盘空间映射给主机使用的。 - 使用场景: - docker容器、虚拟机远程挂载磁盘存储分配。 - 日志存储。 - 文件存储。 - ... 2、文件存储 ... -
Mysql存储过程修改定义者
2013-12-20 17:13:44Mysql中,执行存储过程时会检查过程的定义用户是否存在,如果不存在,即使当前用户有execute权限,也会报错 误码: 1449 The user specified as a definer (‘') does not exist 这个时候,如果想要继续执行这些过程... -
安卓手机外置sd卡的权限怎么打开?
2020-12-19 20:57:28展开全部在2.x的版本中,在manifest中配e69da5e887aa3231313335323631343130323136353331333365633962置的权限android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。而在4.0开发的源码当中,... -
mysql存储过程的权限 definer
2018-03-13 14:08:56mysql中用户对存储过程的权限有: ALTER ROUTINE 编辑或删除存储过程 CREATE ROUTINE 创建存储过程 EXECUTE运行存储过程 存储过程的创建者拥有存储过程的ALTER、CREATE、EXECUTE权限。 DEFINER用于指明存储过程... -
Mysql修改存储过程相关权限问题
2020-09-21 21:44:14正常情况下存储过程的定义者对它有修改、删除的权限;但是其它的用户就要相于的授权,不然无法查看、调用; mysql 中使用用户A创建一个存储过程,现在想通过另一个用户B来修改A创建的存储过程;以下记录就是基于这样... -
Android 动态获取存储、位置、电话的权限(附代码)
2018-10-11 16:49:07便在登录界面加上获取权限代码,此次获取的是存储、位置、电话的权限,如有其它需求可按此格式来进行添加。 首先在 onCreate部分添加判断语句及引用。 //判断是否为android6.0系统版本,如果是,需要动态... -
定义Person类, 属性: 姓名 、年龄 方法: ...定义一个数组,用于存储Person对象,可以存储5个Person对象。
2020-10-10 11:33:27// 定义一个数组,用于存储Person对象,可以存储5个Person对象。 // 对象的属性信息,通过键盘录入的方式进行赋值。 // 遍历数组,显示对象的属性信息。 public static void main(String[] args) { // TOD -
mysql执行存储过程权限的问题
2016-07-12 18:37:03最近在做项目升级,之前所有项目链接数据库都是使用的root账户,为了安全考虑给项目单独开了个用户,添加了增删改查 以及execute权限,但是项目在调用存储过程是仍然报错,说没有权限,查询之后发现除了execute外,... -
ORACLE执行存储过程权限不足
2019-04-20 10:36:06一个存储过程:里面创建一个序列,报无权限错误 但放在plsql工具里面就有权限,可以创建。 原因是:存储过程里面的权限需要显式的授权,即使这个用户有dba权限。 方法:定义函数的时候加上Authid Current_User ...