--禁用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資料庫的存儲過程的結束符必須是'/'嗎 如果存儲過程中間有'/',怎麼區分是否已經結束
/是區分存儲過程的,程序可以通過/判斷一個存儲過程執行完了