当前位置:首页 » 服务存储 » 存储过程稽核标识是什么
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

存储过程稽核标识是什么

发布时间: 2022-04-27 13:52:05

① 如何实现数据库存储过程操作审计

--禁用C2 审核跟踪和只限成功的登录
EXEC sys.sp_configure N'c2 audit mode', N'0'
GO
RECONFIGURE WITH OVERRIDE
GO

USE [master]
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSsqlServer\MSSQLServer', N'AuditLevel', REG_DWORD, 1
GO

SQLSERVER2008新增的审核功能
在sqlserver2008新增了审核功能,可以对服务器级别和数据库级别的操作进行审核/审计,事实上,事件通知、更改跟踪、变更数据捕获(CDC)
都不是用来做审计的,只是某些人乱用这些功能,也正因为乱用这些功能导致踩坑
事件通知:性能跟踪
更改跟踪:用Sync Services来构建偶尔连接的系统
变更数据捕获(CDC):数据仓库的ETL 中的数据抽取(背后使用logreader)

而审核是SQLSERVER专门针对数据库安全的进行的审核,记住,他是专门的!

② 数据库中的存储过程到底是什么能不能举个详细的例子

存储过程,实际就是一段写在数据库中的代码。。
由于此段数据库操作代码由服务器完成,而客户端只是进行简单的参数提交,所以,可以有效的利用服务器的强劲而减小对客户机的负合。
如:你想插入一条数据到数据库。
虽然你的要求是,先检查表里面是否己存在该项。
如果不存在就Insert,如果存在就UPDATE。
这个时候,你就可以把这个判断用存储过程来写。
你的程序只要提示你想要保存到数据库里面的东西即可。
下面就是一个简单的存储过程。
CREATE
PROCEDURE
[insert_A_Employees]
(@fWorkNo
[int],
@fWorkName
[char](10),
@fDeptName
[varchar](20),
@fGroupName
[varchar](20),
@fRecordDate
[datetime])
AS
declare
@iCount
int
select
@iCount
=
count(*)
from
A_EMPLOYEES
where
@fWorkNo
=
fWORKNO
--统计该工号在数据库的数量赋值给
@iCount
if
@iCount
=
0
--如果数据库中不存在该工号
begin
INSERT
INTO
[CLKQ].[dbo].[A_Employees]
--则插入数据
(
[fWorkNo],
[fWorkName],
[fDeptName],
[fGroupName],
[fRecordDate])
VALUES
(
@fWorkNo,
@fWorkName,
@fDeptName,
@fGroupName,
@fRecordDate)
return
1
--返回一个标识
end
else
begin
--否则则更新数据
update
[CLKQ].[dbo].[A_Employees]
set
[fWorkName]=@fWorkName,
[fDeptName]=@fDeptName,
[fGroupName]=@fGroupName,
[fRecordDate]=@fRecordDate
where
[fWorkNo]=@fWorkNo
return
0
--返回一个标识
end
GO
此时你只要在客户端程序提供:
@fWorkNo
,
@fWorkName
,
@fDeptName
,
@fGroupName
,
@fRecordDate
这几个值就行了。。
其它处理过程就由服务器方处理了。
以上是以
SQL
数据库为例。。。
ACCESS
等数据库没有此功能。

③ 存储过程报错,以**开头的标识符太长,最大长度为128

没有看到你的程序和存储过程,但显然你的这一段文字被SQL SERVER 解释成了变量名称而不是变量值。所以错误肯定是出在你在VB里面构建这个字符串的过程中。

④ ORACLE 存储过程中报标识符无效问题

不需要用双引号将列表包起来,使用双引号表示要求列名与数据库表定义的列名大小写一致。另外要注意检查下建表语句中是否也使用双引号,如果使用了,要去掉双引号。

⑤ SQL中存储过程out与output有什么不同,感觉它俩是同一个意思,一样的用法,都是用于输出。求

你好题主,刚好最近我也在学习SQL,不过我在学习的是Oracle,

MSSQL和Oracle倒是有很多不同的地方。

所以我特意打开MSSQL的服务,在MSSQL里写了这么一个脚本,希望能帮助到你。

因为本人是做.Net方向的开发者,所以用了C#语言中

以下是脚本内容:

--SQLQueryCreateByFaywool
createprocProc_OutPutTest--创建
@numAint,--numA为存储过程的参数
@numBint,--numB为另一参数
@numReturnintoutput--此为Output,也就是存储过程的返回值
as
begin
if(@numA>@numB)
set@numReturn=@numA
else
set@numReturn=@numB--A>B的时候返回A,否则返回B
end

go


declare@numReceiveint--先声明一个变量用来接收存储过程的返回值
execProc_OutPutTest1,2,@numReceiveoutput
--调用存储过程并用@numReturn接收存储过程的返回值
select@numReceive--将会返回(1,2)中较大的数字:2

go

createprocProc_OutTest--新建存储过程
@numCint,--参数C
@numDint,--参数D
@numEintout--参数E用来返回
as
begin
if(@numC>@numD)
set@numE=@numC--如果C>D,将C赋值给E
else
set@numE=@numD--否则将D赋值给E
end

go


declare@numOutReceiveint--声明一个变量
set@numOutReceive=10000--将变量赋值为10000
select@numOutReceive--变量变为10000
execProc_OutTest1,2,@numOutReceiveout--将(1,2,@numOutReceive)三个数字传入存储过程
select@numOutReceive--再看变量就变成2了
--总结:

--Out是参数,传进、传出,缺一不可,在存储过程定义的时候一定要有out标识,
--在调用该存储过程的时候也要有out标识


--OutPut则是相当于存储过程的返回值
--不用传进,也不能传进
--它是在存储过程中定义,并且输出的

--一句话:Out相当于C#中的ref参数(传进、传出缺一不可),而且传进传出的时候都要标识为ref
--OutPut则为C#中的方法返回值类型,在方法定义时就已经定好了

⑥ 存储过程 添加成功返回 标识列

select @@identity 就返回了啊

⑦ sql存储过程中..##和..#的区别,用法,用途,求解释

临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。

临时表有两种类型:

本地临时表
以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表,链接断开时临时表即被删除(本地临时表为创建它的该链接的会话所独享)或者这样说局部临时表是有当前用户创建的,并且只有当前用户的会话才可以访问
如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建(其实可看作是不同的链接,不同的会话),则数据库引擎必须能够区分由不同用户创建的表。为此,数据库引擎在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的 table_name 不能超过 116 个字符。
对于本地临时表来说,需要注意在不同情形下应用本地临时表其删除的实际。如假设数据库在执行一个存储过程的时候建立了本地临时表。那么此时这个本地临时表并不是在会话终止的时候自动删除,而是在这个存储过程执行完毕后就会删除。这是什意思呢?也就是说,用户发起的某个会话,为了执行一个特殊的作业(如用户的这个会话调用了某个存储过程)。此时其实就是会话再创建一个子会话的过程。在这种情况下需要注意的是,子会话创建的本地临时表只在子会话内部有效。当这个子会话终止的时候(存储过程执行完毕),此时这个临时表就会自动删除。即对于调用这个子会话的会话来说,这个其子会话的创建的临时表对于其也是无效的,因为临时表已经在子会话关闭的时候自动删除。做一个形象的比喻。即现在做父亲的去叫儿子造一座房子。当儿子死亡的时候,这座房子也会消失。对于这种情况,数据库管理员需要注意。父会话只能够引用子会话从临时表中传递出来的数据。也就是说,父会话要访问子会话创建的临时表的数据,只有一种手段。即先让子会话对临时表中的数据进行查询或者操作,然后把结构回传给父会话。父会话是不能够直接访问子会话所创建的临时表。当然这个限制是专门针对本地临时表而言的。对于全局临时表来说,本身就是所有用户都可以访问,为此就没有这个限制。

全局临时表
以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表或者这样说只要这个全局临时表存在,那么用户创建会话后对所有的用户都是可见的。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们(换句话说旧的任务还何以引用)。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。

⑧ 存储过程中的 procere、function和 package是干什么的,需要详细介绍

procere:过程
function:函数
package:包

一、过程
PL/SQL过程是一个编译到oracle数据库模式的单机程序。过程可以接受参数。当编译一个过程时,CREATE PROCEDURE语句的过程标识符成为数

据字典中的对象名。
CREATE OR REPLACE PPROCEDURE procere_name (optional parameters) IS | AS
declarative part
BEGIN
program body
EXCEPTION
exception handler
END procere_name;

Declarative Part 是声明变量的地方,比如:
local_counter NUMBER := 0;
也可以声明复合类型结构,如records和tables
也可以声明异常,但必须在Exception部门进行处理。
Subprogram Body 包含使用PL/SQL控制结构的逻辑算法实现。PL/SQL控制结构支持loops、if-then-else、case、和声明块结构。
Exception handler 可选,类似于其他语言的try-catch模型,你可以对特定错误类型或一般异常编写处理器.

应当以动词来命名一个过程。过程常常执行一些操作如更新数据库、写数据到一个文件或者发送一条消息。
一个过程不必要有参数,如果没有参数创建过程是不需要括号。当调用一个过程时(过程没有参数)括号是可选的。
例如:
CREATE OR REPLACE PROCEDURE insert_temp IS
BEGIN
INSERT INTO TEMP (n) VALUES (0);
END insert_temp:

sqlplus调用过程:
SQL>execute insert_temp;
SQL>execute insert_temp();
都是正确的。

IS 或 AS关键字是一样的,都可以用。
PROCEDURE insert_temp IS | AS

END关键字后加过程名也是可选的,但建议加过程名。一个过程可能跨越几屏的长度,当滚屏时,有助于看到END子句知道没有跳到下一个包过

程中。

完整的过程结构如下:
CREATE OR REPLACE PROCEDURE print_temp
IS
v_average NUMBER;
v_sum NUMBER;
BEGIN
SELECT AVG(n), SUM(n) INTO v_average, v_sum
FROM TEMP;

dbms_output.put_line('Average:'||v_average);
dbms_output.put_line('Sum:'||v_sum);
END print_temp;

二、函数
函数提供了获取对象状态和情形信息的手段,函数有返回值。
CREATE OR REPLACE FUNCTION student_status(optional parameters)
RETURN VARCHAR2 IS
declarative part
BEGIN
program body
RETURN expression;
EXCEPTION
exception handler code
that should include a RETURN
END student_student_status;

参数是可选的,但RETURN语句是必须的。FUNCTION必须有一个return 语句。
下面的例子是返回一个DATE类型的函数:
CREATE OR REPLACE FUNCTION tomorrow RETURN DATE
IS
next_day DATE;
BEGIN
next_day := SYSDATE + 1;
RETURN next_day;
END tomorrow;

函数中的return语句可以是一个表达式,上面函数可以直接返回一个表达式而不用本地变量:
FUNCTION tomorrow RETURN DATE IS
BEGIN
RETURN SYSDATE + 1;
END tomorrow;
函数于过程结果相似,只是函数返回值,而过程不返回值

三、包说明
1、语法和风格
包说明基本语法:
CREATE PACKAGE package_name IS
Type definitions for records, index-by tables,
varrays, nested tables
Constants
Exceptions
Global variable declarations
PROCEDURE procere_name_1 (parameters & types);
PROCEDURE procere_name_2 (parameter & types);
FUNCTION function_name_1 (parameters & types) RETURN type;
END package_name;

包说明中过程和函数没有顺序限制。
包主体将包含包说明中每一个子程序的PL/SQL代码。包说明中的每一个子程序包体中必须有相应的子程序体。
在包说明中的数据对象声明是全局的。因此,仅声明需要全局定义的对象。
在包体内的过程语句,包括子程序名、参数名、参数模式、参数类型,必须匹配包说明中的过程语句。同样,函数也是一样。
包主体模板如下:
CREATE PACKAGE BODY package_name IS
PROCEDURE procere_name_1 (parameters & types)
IS
local variables
BEGIN
body of code
END procere_name_1;
PROCEDURE procere_name_2 (parameter & types)
IS
local variables
BEGIN
body_of_code
END procere_name_2;
FUNCTION function_name_1 (parameters & types) RETURN type
IS
local variables
BEGIN
body of code
RETURN statement;
END function_name_1;
END package_name;

2、示例:

CREATE OR REPLACE PACKAGE students_pkg IS
PROCEDURE add_student
(v_student_name IN students.student_name%TYPE,
v_college_major IN students.college_major%TYPE,
v_status IN students.status%TYPE,
v_state IN students.state%TYPE DEFAULT NULL,
v_license_no IN students.license_no%TYPE DEFAULT NULL);

FUNCTION NO_OF_STUDENTS
(v_major IN major_lookup.major_desc%TYPE DEFAULT NULL,
v_status IN students.status%TYPE DEFAULT NULL)
RETURN NUMBER;
END students_pkg;

四、包主体
下面是上例的包主体实现:
CREATE OR REPLACE PACKAGE BODY students_pkg IS
PROCEDURE add_student
(v_student_name IN students.student_name%TYPE,
v_college_major IN students.college_major%TYPE,
v_status IN students.status%TYPE,
v_state IN students.state%TYPE DEFAULT NULL,
v_license_no IN students.license_no%TYPE DEFAULT NULL)
IS
BEGIN
INSERT INTO students VALUES
('A'||students_pk_seq.NEXTVAL,
v_student_name,
v_college_major,
v_status,
v_state,
v_license_no);
END add_student;

FUNCTION NO_OF_STUDENTS
(v_major IN major_lookup.major_desc%TYPE DEFAULT NULL,
v_status IN students.status%TYPE DEFAULT NULL)
RETURN NUMBER
IS
ccount INTEGER;
BEGIN
SELECT COUNT (*) INTO ccount
FROM students, major_lookup
WHERE students.college_major = major_lookup.major
AND major_lookup.major_desc =
nvl(v_major,major_lookup.major_desc)
AND students.status = nvl(v_status,students.status);
RETURN ccount;
END NO_OF_STUDENTS;
END students_pkg;

开发包主体可能需要其他本地过程和函数,这些是隐藏的,叫私有(过程或函数)。
常常情况下要把一个单独的过程放入一个新包或一个已存在包里面。
PACKAGE temp_operations IS
PROCEDURE insert_temp;
END temp_operations;

PACKAGE BODY temp_operations IS
PROCEDURE insert_temp IS
BEGIN
INSERT INTO temp (n) VALUES (0);
END insert_temp;
END temp_operations;

使用下面方式调用:
temp_operations.insert_temp;
temp_operations.insert_temp();

http://yaoayao.javaeye.com/blog/710706

⑨ 存储过程 output关键字是什么意思

Out是参数,传进、传出,缺一不可,在存储过程定义的时候一定要有out标识,在调用该存储过程的时候也要有out标识 OutPut则是相当于存储过程的返回值不用传进,也不能传进它是在存储过程中定义,并且输出的 一句话:Out相当于C#中的ref参数(传进、传出缺一不可),而且传进传出的时候都要标识为ref OutPut则为C#中的方法返回值类型,在方法定义时就已经定好了

⑩ oracle数据库的存储过程的结束符必须是'/'吗 如果存储过程中间有'/',怎么区分是否已经结束

/是区分存储过程的,程序可以通过/判断一个存储过程执行完了